我正在使用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
}
感谢您的帮助
答案 0 :(得分:1)
要进行更改,您必须从调用函数传递变量的地址,或者从被调用函数返回已分配内存的地址并将其分配给相应的变量。
在这里你不做任何事情,所以你不能保留变化。
通过传递变量的地址,您可以这样做:(如果您完全了解这一个,则可以轻松完成另一个)。
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
中是一个关键字,在某个变体上命名变量不仅具有误导性,而且在含义上也是错误的。