返回0时的C ++结构错误?

时间:2017-12-29 09:49:47

标签: c++ struct

相当新,代码输出如下:

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;
}

1 个答案:

答案 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;

虽然你应该考虑到:

  • 您最好在C ++中使用new而不是malloc;
  • 如果你使用malloc,你应该检查失败;和
  • C ++(从C ++ 11开始)已经 在其保留曲目forward_list中一个单链表。除非您的目的是学习算法,否则您应该只使用 。在C ++ 11之前,您可以使用list,尽管这是一个双向链接列表。