我是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。我做错了什么?
答案 0 :(得分: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;
}
}
答案 1 :(得分: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)
答案 2 :(得分:1)
你可以将指针传递给指针,正如其他两个答案所说的那样,所以我只想指出一个你可能也会考虑的替代:而不是使用单个结构,你可以使用一个结构列表和另一个用于入口链接:
struct link {
int test;
struct link* next;
};
struct list {
struct link* first;
};
void demo_fill(struct list* data);
然后,您可以修改列表的第一个条目,而不必考虑**
语法。