相当新,代码输出如下:
1→2→出口
然而,程序无法完全执行,(即使这是程序结束,怪异)
以下是代码:
struct ListN{
int value;
ListN* next;
};
int main()
{
struct ListN* newn = (struct ListN*)malloc(sizeof(struct ListN));
newn->value = 1;
struct ListN* temp;
temp = newn;
newn= newn->next;
newn->value = 2;
newn->next = NULL;
while(temp!=NULL){
printf("%d ->",temp->value);
temp = temp->next;
}
printf("exit");
return 0;
}
答案 0 :(得分:0)
这一切归结为以下顺序:
struct ListN* newn = (struct ListN*)malloc(sizeof(struct ListN));
newn->value = 1;
newn= newn->next;
newn->value = 2;
前两个语句创建一个新元素并设置其数据值,但不设置其" next元素"指向任何东西的指针。
第三个语句将newn
设置为存储在第一个元素的next
指针中的任意值,以及第四个用于尝试设置其值的解引用。
这(取消引用任意指针)是未定义的行为,纯粹而简单。在这一点上,允许发生任何。
如果您正在寻找构建双元素列表,以下是更正确的方法:
struct ListN* newn = (struct ListN*)malloc(sizeof(struct ListN));
newn->value = 1;
newn->next = (struct ListN*)malloc(sizeof(struct ListN));
newn= newn->next;
newn->value = 2;
newn->next = NULL;
虽然你应该考虑到:
new
而不是malloc
; malloc
,你应该检查失败;和forward_list
中一个单链表。除非您的目的是学习算法,否则您应该只使用 。在C ++ 11之前,您可以使用list
,尽管这是一个双向链接列表。