C中的While循环在Repl中存在.但在本地运行gcc时不会



我对C相当陌生,但我的老师要求我实现一个链表。

当我在Repl中运行以下代码时。如果它工作,但是当我在windows上使用gcc在我的机器上运行它时,它不会退出while循环。

任何想法?

#include <stdio.h>
#include <stdlib.h>
struct node *newNode(int);
void llAppend(int);
void llPrint(void);
struct node {
int data;
struct node *next;
};
struct node *ll;
int main(void) {
llAppend(2);
llAppend(3);
llPrint();
}
struct node *newNode(int data) {
struct node *tmp;
tmp = malloc(sizeof (struct node));
tmp->data = data;
return tmp;
}
void llAppend(int data) {
struct node *tmp;

if (ll == NULL) {
ll = newNode(data);
return;
}
tmp = ll;
while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = newNode(data);
}
void llPrint(void) {
struct node *tmp;
tmp = ll;
while (tmp != NULL) {
printf("%dn", tmp->data);
tmp = tmp->next;
}
}

不退出while循环。什么好主意吗?

问题是你没有在newNode()中初始化tmp->next。因此,在while循环中,您的代码在试图检查tmp->next时访问未初始化的内存。

当我在Repl中运行解决方案。如果一切正常的话。

这是出于运气。当您访问未初始化的内存时,不知道会发生什么。有可能tmp->next恰好是NULL,所以代码在这种情况下工作。

如何解决?

您需要将newNode()中的tmp->next设置为NULL,如下所示:

tmp->next = NULL;

同时,始终检查malloc的返回值,以确保它不是NULL

修正版:

struct node *newNode(int data) {
struct node *tmp;
tmp = malloc(sizeof (struct node));
if (tmp == NULL) {
exit(EXIT_FAILURE);
}
tmp->data = data;
tmp->next = NULL;
return tmp;
}

另外,考虑使用valgrindgdb,它们是功能强大的工具,可以帮助您调试这样的事情。

注:您的main函数缺少return语句—添加return EXIT_SUCCESS;

newNode()中不初始化next成员。它可以是任何值,不一定是NULL

相关内容

  • 没有找到相关文章

最新更新