【问题标题】:malloc of array in struct passed as argumentstruct 中数组的 malloc 作为参数传递
【发布时间】:2014-08-27 23:09:59
【问题描述】:

我想为数组分配内存,这些数组是我需要使用的结构的成员,在一个将结构作为参数的函数中。

arg->A.size=(int*) malloc(N*sizeof(int));

不会编译(对成员“大小”的请求不是结构。

arg->A->size=(int*) malloc(N*sizeof(int));

会抛出分段错误错误

任何帮助将不胜感激。 这是代码,谢谢:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// struct A 
struct A {
    int dim;                // dimensions
    int* size;              // points per dim array
    double* val;            // values stored in array
    int total;              // pow(size,dim) 
};

// struct B that uses A
struct B {
    int tag;
    struct A* A;
};

int function_AB(struct B* B);

int main(void){
    struct B B;
    function_AB(&B);

    return 0;
}

int function_AB(struct B* arg){
    int N=10;
    arg->tag=99;
    printf("tag assigned = %d \n", arg->tag);
    arg->A->size=(int*) malloc(N*sizeof(int));

    return 0;
}

【问题讨论】:

    标签: c arrays struct malloc


    【解决方案1】:

    您根本没有为struct A *A 分配内存。在将任何内容分配给 A-&gt;size 之前,您首先需要执行类似的操作

    B->A = malloc(sizeof(struct A));
    

    【讨论】:

      【解决方案2】:

      第二种情况是正确的,但是因为 main 中声明的 B 中的 A 没有被赋值而崩溃。你可能想要类似的东西

      struct A A;
      struct B B;
      B.A = &A;
      
      function_AB(&B);
      

      【讨论】:

        【解决方案3】:

        当你在另一个结构中有结构指针时,首先你需要为此分配内存。然后为结构成员分配内存!

        struct B {
            int tag;
            struct A* A;
        };
        

        这里的A 是一个指向名为A 的结构的指针。先为此分配内存,再为struct A的元素分配内存

        arg->A = malloc(sizeof(struct A));
        

        然后做-

        arg->A->size = malloc(N*sizeof(int));
        

        在您的int function_AB(struct B* arg)中尝试以下更改-

        int function_AB(struct B* arg){
        int N=10;
        arg->tag=99;
        printf("tag assigned = %d \n", arg->tag);
        
        arg->A = malloc(sizeof(struct A)); // First allocate the memory for struct A* A; 
        
        arg->A->size = malloc(N*sizeof(int)); // Allocate the memory for struct A members
        arg->A->val = malloc(N*sizeof(double));
        
        // do your stuff
        
        // free the allocated memories here
        free(arg->A->size);
        free(arg->A->val);
        free(arg->A);
        
        return 0;
        }
        

        并且不要投射malloc()的结果!

        【讨论】:

        • 到目前为止,我认为 Sathish 是对的(扩展了 downhillFromHere 在第一个答案中已经提出的更改)。在函数内部实现它正是我想要的,因此我专门使用 arg->A = malloc(sizeof(struct A)) 指令,而不管之前/之后的赋值。我仍然会使用 malloc int 和 double cast 来表示 size 和 val。有什么理由避免这样做吗?在函数返回之前,我仍然需要弄清楚是否必须对 A、size 和 val 使用 free。如果出现问题,我会更新。非常感谢。
        • @mae In c malloc 将分配内存并返回指向已分配内存的适当指针!如果您发现此答案有帮助,请不要忘记验证!
        • 你是对的。由于从实际需要它的 C++ 迁移而导致的不良做法。
        猜你喜欢
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        相关资源
        最近更新 更多