gpt4 book ai didi

c - 函数执行后指针为空

转载 作者:行者123 更新时间:2023-11-30 19:06:46 25 4
gpt4 key购买 nike

我正在使用 C 语言中的链表,但我认为不太了解指针的使用。

我有一个链接列表的结构。我将第一个元素初始化为 NULL。我将此指针发送到一个函数来创建(使用 malloc)列表的新元素。但在调用该函数后,我的元素仍然为 NULL。我不明白。这肯定是一个愚蠢的错误,但我需要一些帮助..

typedef struct Goto Goto;
struct Goto
{
int index;
Goto *next;
};


//my code
Goto* gotoList = NULL;
addLabel(gotoList, index);
// Here : gotoList is NULL


void addLabel(Goto* gotoList, int value) {
if (gotoList == NULL) {
Goto* gotoLabel = malloc(sizeof(*gotoList));
gotoLabel->index = value;
gotoLabel->next = NULL;
gotoList = gotoLabel;
}
else {
Goto* gotoLabel = gotoList;
Goto* newLabel = malloc(sizeof(*newLabel));
newLabel->next = NULL;
newLabel->index = value;
while (gotoLabel->next != NULL) {
gotoLabel = gotoLabel->next;
}
gotoLabel->next = newLabel;
}
// Here : gotoList is not NULL

}

谢谢你帮助我

最佳答案

要进行更改,您必须从调用者函数传递变量的地址,或者从被调用者函数返回已分配内存的地址并将其分配给相应的变量。

在这里,您没有执行任何操作,因此您无法保留更改。

通过传递变量的地址,你可以这样做:(如果你完全理解这个,另一个可以轻松完成)。

void addLabel(Goto** gotoList, int value) {
if (*gotoList == NULL) {
Goto* gotoLabel = malloc(sizeof(*gotoLabel ));
gotoLabel->index = value;
gotoLabel->next = NULL;
*gotoList = gotoLabel;
}
else {
Goto* gotoLabel = *gotoList;
Goto* newLabel = malloc(sizeof(*newLabel));
newLabel->next = NULL;
newLabel->index = value;
while (gotoLabel->next != NULL) {
gotoLabel = gotoLabel->next;
}
gotoLabel->next = newLabel;
}
}

这里我们所做的只是传递变量的地址。您将像这样调用该函数

addLabel(&listhead,val);

有一件事,你在选择变量名称时做出了错误的选择。 Goto 是最后选择的变量名。在C中,goto是一个关键字,用它的某些变体命名变量不仅会产生误导,而且在含义上也是错误的。

关于c - 函数执行后指针为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680256/

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