返回0时的C 结构误差

C++ Structure error at Return 0?

本文关键字:结构 误差 0时 返回      更新时间:2023-10-16

相当新,代码输出如下:

1-> 2->退出

但是,程序无法完全执行(即使这是程序的终结,Spooky)

这是代码:

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

所有这些都归结为以下序列:

struct ListN* newn = (struct ListN*)malloc(sizeof(struct ListN));
newn->value = 1;
newn= newn->next;
newn->value = 2;

前两个语句创建一个新元素并设置其数据值,但DO 不是将其"下一个元素"指针设置为任何东西。

第三个语句将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在C ;
  • 中会更好
  • ,如果您 do 使用malloc,则应检查失败;和
  • c (从C 11开始)已经在其曲目forward_list中具有单一连锁的列表。除非您的意图是学习算法,否则您可能应该只使用。在C 11之前,您可以只使用list,尽管这是一个双关联列表。