gpt4 book ai didi

C: 将新项目分配给链表中的 "next"指针失败

转载 作者:行者123 更新时间:2023-12-04 18:13:03 25 4
gpt4 key购买 nike

我在下面的链表函数中遇到了一个错误,我不知道该怎么办。疯狂的部分(对我来说)是我的代码到目前为止一直运行良好,并且在遇到错误之前仍然可以进行多次调用。

该函数的目标是在 PathItem 链表的末尾添加一个新项(PathItem,其中包含一个 BinaryItem)。我的功能如下

void addPathItemAtEnd(struct PathItem * pathItem, struct BinaryItem * binaryItem) {
if (pathItem == NULL) {
pathItem = malloc(sizeof(struct PathItem));
pathItem->binaryItem = binaryItem;
pathItem->next = NULL;
} else {
while (pathItem->next != NULL) {
pathItem = pathItem->next;
}
struct PathItem * newPathItem = malloc(sizeof(struct PathItem));
newPathItem->binaryItem = binaryItem;
newPathItem->next = NULL;
pathItem->next = newPathItem;
}
}

有问题的行是 pathItem->next = newPathItem .我收到错误 EXC_BAD_ACCESS在调试器中。再一次,这段代码以前运行良好,所以我不明白现在发生了什么来扰乱它......

这似乎是重新分配指针变量的问题。不知道怎么了。

任何想法,建议,批评。如果需要,我可以附加更多/我的代码的其余部分。真的需要你的帮助和提前感谢。

最佳答案

您的主要问题是 pathItem作为副本传入,因此对其所做的更改不会反射(reflect)在原始代码中。 C 使用按值传递的范例(C++ 也使用按值传递,但它至少具有引用类型,因此您不必纠结于 C 的钝指针方法)。

我看不出这会如何工作,因为如果你传入的指针为 pathItem最初为 NULL,当您返回时它保持 NULL。换句话说,列表总是空的。

可能最简单的解决方法是将原型(prototype)更改为:

void addPathItemAtEnd (struct PathItem *pPathItem, blah blah blah ...

然后,无论你现在拥有 pathItem在该函数中,将其替换为 (*pPathItem) .

而且,当然,用指针调用它,改变(类似):
addPathItemAtEnd (listStart, newItem);

至:
addPathItemAtEnd (&listStart, newItem);

顺便说一句,健壮的代码也会检查 malloc 的返回值。并采取相应行动。虽然类作业和小型个人项目可能会在假设没有失败的情况下侥幸成功,但这在现实世界中并不会削减它:-)

关于C: 将新项目分配给链表中的 "next"指针失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12241847/

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