1

我是 C 新手。我正在尝试将结构列表传递给函数,并在该函数中填充列表。代码如下:

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

struct Abc {
    int test;
    struct Abc *next;
};

void demo_fill(struct Abc *data);

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc *data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = data;
       data = new;
   }  
}

运行此操作时,会发生“分段错误(核心转储)”错误,因为当我尝试打印第一个元素时结构仍然为 NULL。我究竟做错了什么?

4

3 回答 3

5

您正在按值传递指针。如果要更改调用者指针的值,则需要将指针传递给指针:

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(&db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc **data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}
于 2013-02-14T16:29:55.247 回答
2

将数据分配给 new 将无效。data是指针的本地副本。传递一个双指针来解决这个问题。像这样的东西:

void demo_fill(struct Abc** data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}

当然,您必须在 main 中传递指向 db 的指针:

demo_fill(&db)
于 2013-02-14T16:29:59.493 回答
1

您可以像其他两个答案所说的那样将指针传递给指针,所以我只是指出您可能还会考虑的一种选择:您可以将一个结构用于列表,另一个用于入口链接,而不是使用单个结构:

struct link {
    int test;
    struct link* next;
};
struct list {
    struct link* first;
};

void demo_fill(struct list* data);

然后,您可以修改列表的第一个条目而无需考虑**语法。

于 2013-02-14T16:36:27.130 回答