在下面的代码中,您可以看到使用C中的指针实现的基本整数链接列表。 我已经写了两个不同的函数,用于在列表的前面插入一个新的int-val。 我认为这两个函数是等价的,但是输出显示它们不是。
#include <stdio.h>
#include <stdlib.h>
typedef struct _IntlistElem* Intlist;
typedef struct _IntlistElem {int val; Intlist next;} IntlistElem;
Intlist insertfirst(int val, Intlist list) {
Intlist new = malloc(sizeof(IntlistElem));
new->val = val;
new->next = list;
return new;
}
Intlist insertfirstAlternative(int val, Intlist list) {
IntlistElem new = {val, list};
Intlist head = &new;
return head;
}
void print(Intlist l){
while (l!=NULL){
printf("%d\n", l->val);
l = l->next;
}
printf("_____\n");
}
int main(){
Intlist ls = NULL;
ls = insertfirst(2, ls);
ls = insertfirst(1, ls);
print(ls);
Intlist lsAlt = NULL;
lsAlt = insertfirstAlternative(2, lsAlt);
lsAlt = insertfirstAlternative(1, lsAlt);
print(lsAlt);
return 0;
}
输出:
1
2
_____
1
1
...
我的问题是:
1。
为什么打印功能不会终止? (在调用替代功能后)
2。
为什么这些2&#34; insertfirst&#34; -functions与我预期的不相同?
这些功能有什么区别?
我期待着你的回答。 :)
答案 0 :(得分:1)
您的函数insertfirstAlternative
返回指向head
的指针。该变量的生命周期从函数返回时结束。因此,它返回一个无效的指针值。
当指针指向的对象到达其生命周期的末尾时,指针的值变得不确定。
任何事情都可能发生。
在您的情况下,第二次调用该函数时,第二个head
创建在与第一个相同的地址,因此next
指针指向同一个对象。因此无限循环。