函数后指针为空

时间:2017-12-06 17:35:02

标签: c pointers linked-list

我正在使用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

}

感谢您的帮助

1 个答案:

答案 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中是一个关键字,在某个变体上命名变量不仅具有误导性,而且在含义上也是错误的。