我的测试代码如下:
#include <stdio.h>
struct test {
int contents;
struct test *next;
};
main() {
struct test *first = NULL;
struct test *last = NULL;
int i;
for (i = 0; i < 2; i++) {
struct test tmp;
if (first == NULL) {
first = &tmp;
last = &tmp;
} else {
last->next = &tmp;
last = &tmp;
}
tmp.x = i;
tmp.next = NULL;
}
while (first != NULL) {
printf("%d\n", first->x);
first = first->next;
}
return 0;
}
运行这个,我得到的输出首先似乎指向一个值为'1'的测试结构,因为它是'x'变量 - 所以不是我想要的初始值。那么,我在逻辑上失败了,还是我没理解如何在循环中声明新的单独结构?或者两者都有?我很累......&gt; _&lt;。
感谢。
答案 0 :(得分:2)
您遇到的问题是您正在获取临时变量tmp
的地址,并将其分配给比临时变量first
和last
长得多的指针。在循环的每次迭代之后,临时消失并继续通过first
和last
访问它导致未定义的行为。
您需要在堆上创建一个值,以便像这样构建列表(为简洁起见,省略了错误检查)
struct test* tmp = malloc(sizeof(struct test));
稍后您需要通过free
所有已分配的节点。