gpt4 book ai didi

c - 简单的c程序在windows中崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:36 25 4
gpt4 key购买 nike

我是 c 的新手。我有以下创建双链表的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct Dnode
{
char c;
struct Dnode *left;
struct Dnode *right;
}Dnode;
void insert(Dnode *,char);
void unshift(Dnode *,char);
void travel(Dnode *);
int main(){
Dnode *cur = (Dnode *)malloc(sizeof(Dnode));
Dnode *head = NULL;
head = cur;

cur -> c = 'a';
printf("Cur -> c: %c\n",cur->c);
cur ->left = NULL;
cur -> right = (Dnode *)malloc(sizeof(Dnode));
cur->right->c = 'b';
cur->right->left = cur;
cur = cur->right;
travel(head);
system("pause");
return 0;
}
void reset(Dnode *h){
while(h->left)
h=h->left;
}
void travel(Dnode *head){
printf("Traversing all nodes of list:\n");
while(head->right){
printf("Received char from node %c\n",head->c);
head = head->right;
}
//reset(head);
}
void insert(Dnode * d,char c){
Dnode *t = d;
while(t ->right)
t=t->right;
t->right = (Dnode *)malloc(sizeof(Dnode));
if(t->right){
t->right->c = c;
t= t->right;
t->right = t->left = NULL;
}
}
void unshift(Dnode *d,char cc){
Dnode *t =(Dnode *)malloc(sizeof(Dnode));
t = d->right;
t->left =NULL;
d->left = t;
d = t;
}

问题是在调用 travel() 之后所有的节点都被打印出来了。它打印“从节点 a 接收到的字符”和“从节点 b 接收到字符”

但是 Windows 给我一个错误,说程序已经崩溃。有什么想法吗?我想要一个详细的答案,以避免将来出现类似的问题。

最佳答案

初始化后您的列表如下所示:

   head ------>  X  ------> Y ------> uninitialized
/ ^ /
/ | /
/ \ /
null<--- -------

所以在 travel 函数中,您首先在第一个循环中打印 X.c,然后在第二个循环中使用未初始化的指针。这会导致程序崩溃。

所以你需要添加:

cur->right->c = 'b';
cur->right->left = cur;
cur->right->right = NULL // Add this line

到初始化。

另请注意,您没有释放 分配的资源。所以在 main 中(就在 return 之前)你应该这样做:

Dnode *tmp;
while(head){
tmp = head;
head = head->right;
free(tmp);
}

顺便说一句 - 不要强制转换 malloc 返回的值。只需执行 Dnode *cur = malloc(sizeof(Dnode));

顺便说一句——这一行:

cur = cur->right;

可以删除,因为 cur 之后不再使用。

关于c - 简单的c程序在windows中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com