gpt4 book ai didi

c - 无限循环和指针

转载 作者:行者123 更新时间:2023-12-04 12:07:57 24 4
gpt4 key购买 nike

我是 C 的新手。我熟悉 Python、Java、C#。因此,我在指针方面遇到了问题。

我正在尝试使用结构在 C 中实现链表。到目前为止,该程序创建根成员,然后再添加一个成员以拥有一个包含 2 个链接成员的列表。然后它调用打印方法,该方法应该遍历每个项目并打印它们。不幸的是,该程序陷入了无限循环,似乎正在打印成员->数据地址而不是数据本身。

正如我之前所说,我熟悉几种 OOP 语言。这个问题令人沮丧,因为我应该可以在几分钟内敲定一个简单的链表。有什么帮助吗?代码如下。

#include<stdio.h>
#include<stdlib.h>

struct Member{
int data;
struct Member *next;
};

struct Member *createMember(int i){
struct Member *new;
new = malloc(sizeof(struct Member));
new->data = i;
return new;
}

void print(struct Member *root){
struct Member *current = root;
while(current->next != NULL){
printf("%i, ", current->data);
current = current->next;
}
printf("%i", current->data);
}

main(){
struct Member *root;
root = createMember(15);
root->next = createMember(12);
print(root);
}

最佳答案

这个函数:

struct Member *createMember(int i)
{
struct Member *new;
new = malloc(sizeof(struct Member));
new->data = i;
return new;
}

分配空间并分配数据,但从不初始化 next 成员。结果是该成员包含不确定数据,因此调用未定义的行为甚至进行评估,更不用说取消引用了,前者在此处完成:

void print(struct Member *root)
{
struct Member *current = root;
while(current->next != NULL){ // HERE
printf("%i, ", current->data);
current = current->next; // AND HERE
}
printf("%i", current->data);
}

要解决眼前的问题,请更改分配函数以初始化所有 成员:

struct Member *createMember(int i)
{
struct Member *new;
new = malloc(sizeof(struct Member));
new->data = i;
new->next = NULL; // ADDED THIS
return new;
}

输出

15, 12

其他问题仍然存在(内存泄漏、print() 的行为被传递 NULL 指针、更迂腐的错误检查等),但这是与您的问题相关的最紧迫的问题。

祝你好运。

关于c - 无限循环和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334023/

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