free 导致 C 中的分段错误
free causes segmentation fault in C
在以下仅用于教育目的的程序中,我不明白为什么 free()
会导致分段错误。在最后一个循环中,我尝试清理 op 我的双连接指针列表,但即使是 first_node
上的单个 free()
(如果我将它放在循环外)也会导致分段错误......有人知道为什么吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node {
Node *prev;
Node *next;
int val;
};
int main() {
Node *first_node;
Node *active_node;
Node *prev_node;
first_node->val = 0;
active_node = first_node;
for (int c = 1; c < 10 ; c = c + 1) {
active_node->next = (Node *)malloc(sizeof(Node));
active_node->next->val = c;
active_node->next->prev = active_node;
prev_node = active_node;
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
printf("Node: %d\n", active_node->val);
prev_node = active_node;
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
prev_node = active_node;
active_node = active_node->next;
free(prev_node);
}
return 0;
}
我确定是 free()
,因为当我注释掉该行时,程序运行正常。
我的输出如下所示:
Node: 0
Node: 1
Node: 2
Node: 3
Node: 4
Node: 5
Node: 6
Node: 7
Node: 8
Node: 9
Segmentation fault (core dumped)
first_node
在您执行 first_node->val = 0;
时未初始化。 active_node
接收这个未初始化指针的值,用于列表的最后一个节点。
程序运行起来真的很令人惊讶,你在 main()
函数的第一条语句上有未定义的行为。
只需将active_node
初始化为NULL
并修复初始化代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node {
Node *prev;
Node *next;
int val;
};
int main() {
Node *first_node;
Node *active_node;
Node *prev_node;
first_node = prev_node = NULL;
for (int c = 0; c < 10; c = c + 1) {
Node *new_node = (Node *)malloc(sizeof(Node));
if (new_node == NULL)
return 1;
new_node->val = c;
new_node->prev = prev_node;
new_node->next = NULL;
if (prev_node)
prev_node->next = new_node;
else
first_node = new_node;
prev_node = new_node;
}
active_node = first_node;
while (active_node) {
printf("Node: %d\n", active_node->val);
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
prev_node = active_node;
active_node = active_node->next;
free(prev_node);
}
return 0;
}
在以下仅用于教育目的的程序中,我不明白为什么 free()
会导致分段错误。在最后一个循环中,我尝试清理 op 我的双连接指针列表,但即使是 first_node
上的单个 free()
(如果我将它放在循环外)也会导致分段错误......有人知道为什么吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node {
Node *prev;
Node *next;
int val;
};
int main() {
Node *first_node;
Node *active_node;
Node *prev_node;
first_node->val = 0;
active_node = first_node;
for (int c = 1; c < 10 ; c = c + 1) {
active_node->next = (Node *)malloc(sizeof(Node));
active_node->next->val = c;
active_node->next->prev = active_node;
prev_node = active_node;
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
printf("Node: %d\n", active_node->val);
prev_node = active_node;
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
prev_node = active_node;
active_node = active_node->next;
free(prev_node);
}
return 0;
}
我确定是 free()
,因为当我注释掉该行时,程序运行正常。
我的输出如下所示:
Node: 0
Node: 1
Node: 2
Node: 3
Node: 4
Node: 5
Node: 6
Node: 7
Node: 8
Node: 9
Segmentation fault (core dumped)
first_node
在您执行 first_node->val = 0;
时未初始化。 active_node
接收这个未初始化指针的值,用于列表的最后一个节点。
程序运行起来真的很令人惊讶,你在 main()
函数的第一条语句上有未定义的行为。
只需将active_node
初始化为NULL
并修复初始化代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node {
Node *prev;
Node *next;
int val;
};
int main() {
Node *first_node;
Node *active_node;
Node *prev_node;
first_node = prev_node = NULL;
for (int c = 0; c < 10; c = c + 1) {
Node *new_node = (Node *)malloc(sizeof(Node));
if (new_node == NULL)
return 1;
new_node->val = c;
new_node->prev = prev_node;
new_node->next = NULL;
if (prev_node)
prev_node->next = new_node;
else
first_node = new_node;
prev_node = new_node;
}
active_node = first_node;
while (active_node) {
printf("Node: %d\n", active_node->val);
active_node = active_node->next;
}
active_node = first_node;
while (active_node) {
prev_node = active_node;
active_node = active_node->next;
free(prev_node);
}
return 0;
}