-2

我有一个包含 int 指针的结构

    struct mystruct {
      int *myarray;
    };

我想创建一个为 mystruct 分配并初始化 myarray 的函数。但是,当我尝试访问 myarray 的一个元素时,我得到了一个 seg。过错

    void myfunction(struct mystruct *s, int len) {
        s = malloc(sizeof(mystruct));
        s->myarray = malloc(sizeof(int) * len);
        int i;
        for (i=0; i<len; i++) {
            s->myarray[i] = 1;
        }
    }

    main() { 
        struct mystruct *m;
        myfunction(m, 10);
        printf("%d", m->myarray[2]); ////produces a segfault
    }

但是,在 main 中分配 m 似乎解决了我的问题。修改后的代码:

    void myfunction(struct mystruct *s, int len) {
        int i;
        s->myarray = malloc(sizeof(int) * len); 
        for (i=0; i<len; i++) {
            s->myarray[i] = 1;
        }
     }

     main() {
         struct mystruct *m = malloc(sizeof(mystruct)); //this was in myfunction 
         myfunction(m,10);
         printf("%d", m->myarray[2]); ///Prints out 1 like I wanted
     }

为什么第二次尝试成功,为什么第一次尝试失败?

4

1 回答 1

2

问题是第一个版本将 malloc 的结果分配给一个参数,该参数实际上是一个局部变量;函数返回时赋值消失

因此,另一种方法是将指针传递给函数,该指针指向要存储 malloc 结果的位置。pps这是在下面的代码中命名的。在函数的开头,我们执行 malloc 并分配给局部变量s。然后我们用s. 然后,就在函数退出之前,我们将局部变量分配给s参数指向的位置pps*pps = s;

void myfunction(struct mystruct **pps, int len) { // note double "**" 
        struct mystruct *s = malloc(sizeof(mystruct);
        s->myarray = malloc(sizeof(int) * len);
        int i;
        for (i=0; i<len; i++) {
            s->myarray[i] = 1;
        }
        *pps = s; // now pass the alloc'ed struct back to main through parameter pps
    }

现在,回到main我们传递&m给函数。这会传递一个指向m函数的指针。当函数返回时,局部变量m保存了 malloc 返回的值并通过参数传递pps

main() { 
    struct mystruct *m;
    myfunction(&m, 10); // PASS THE ADDRESS OF m, not m itself
    printf("%d", m->myarray[2]); // this will work now
}
于 2013-11-10T00:46:49.497 回答