Adress没有堆叠,malloc'd或(最近)免费

时间:2016-02-07 19:21:29

标签: c pointers segmentation-fault malloc

我正在尝试将一些成员添加到基本链接列表中(我总是添加到列表的末尾)。

列表代码:

void createList(char * name, Test * node) {
    static int flag = 0;

    if(flag == 0 ){
        node->name = NULL;
        node->next = NULL;
        flag = 1;
    }

    Test * newNode;
    newNode = malloc(sizeof(Test));

    newNode->name = name;

    while(node->next != NULL) {
        node = node->next;
    }

    node->next = newNode;

    free(newNode);

}

这里我使用静态变量来跟踪它是否是第一个函数调用(即列表为空)。

该函数可以自行运行,但是当我调用它来测试它时(将一些值添加到列表中):

int main(void) {
    Test * node;

    node = malloc(sizeof(Test));

    createList("TestName",node);

    printf("First Node in The List is %s\n",node->name); //segfaults

    return 0;
}

似乎是段错误并且在标题中给出了错误。 我的结构看起来像这样:

typedef struct Test Test;
typedef struct Test {
    char * name;
    Test * next;
} Test;

我没有标题节点(我无法改变它)所以我正在使用静态变量。我不认为这是一个内存问题,但可能是我正在设置一个新节点的下一个指针,但原始的第一个节点从未设置?即它始终为NULL导致seg错误。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

执行node->next = newNode时,只复制指针,这意味着您现在有两个指向同一内存的指针。当你释放那个内存时,你有两个指向未分配内存的指针。

尝试取消引用任何指针都会导致未定义的行为

解决方案当然是不要在新分配的内存上调用free

啊,上面实际上并不是你崩溃的原因,问题是你取消引用了一个空指针。在您执行的createList功能中

node->name = NULL;

然后在main函数中尝试使用此空指针。

main函数中,node是一个虚节点,其next指针将指向实际的第一个节点。

现在我还看到了另一个问题:您没有初始化newNode->next,因此如果您尝试取消引用node->next->next,您将再次拥有未定义的行为

答案 1 :(得分:0)

问题在于,createList在您将newNode添加到列表后立即释放free,因此数据无效。清理列表时只需name

此外,列表中的第一个节点的NULL始终等于printf。因此,在main void createList(char * name, Test * node) { static int flag = 0; if(flag == 0 ){ node->name = strdup(name); node->next = NULL; flag = 1; } else { Test * newNode; newNode = malloc(sizeof(Test)); newNode->name = strdup(name); while(node->next != NULL) { node = node->next; } node->next = newNode; } } 中,您尝试取消引用NULL指针,这会导致段错误。

更好的办法是不在第一次调用时创建新节点,因为您已经有一个空节点:

set count = %count% + 1

答案 2 :(得分:0)

这里有一个严重的问题:

node->next = newNode;

free(newNode);

您设置指向新节点的指针,然后将其删除。现在指针将无处指向。

在您不再需要它之前,您无法释放内存。