我正在尝试将一些成员添加到基本链接列表中(我总是添加到列表的末尾)。
列表代码:
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错误。任何帮助将不胜感激。
答案 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);
您设置指向新节点的指针,然后将其删除。现在指针将无处指向。
在您不再需要它之前,您无法释放内存。