C语言中的自由段错误

C语言中的自由段错误,c,segmentation-fault,malloc,free,C,Segmentation Fault,Malloc,Free,在以下仅用于教育目的的程序中,我看不出为什么free()会导致分段错误。在最后一个循环中,我尝试清理我的双连接指针列表,但即使是第一个节点上的单个free()(如果我将其放置在循环之外),也会导致分段错误。。。有人知道为什么吗 #include <stdio.h> #include <stdlib.h> typedef struct Node Node; struct Node { Node *prev; Node *next; int val

在以下仅用于教育目的的程序中,我看不出为什么
free()
会导致分段错误。在最后一个循环中,我尝试清理我的双连接指针列表,但即使是
第一个节点上的单个
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;
}

执行
first\u node->val=0时,
first\u node
未初始化<代码>活动节点
接收此未初始化指针的值,并用于列表的最后一个节点

实际上,令人惊讶的是,程序运行时,
main()
函数的第一条语句中有未定义的行为

只需将
active_节点
初始化为
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;
}
#包括
#包括
typedef结构节点;
结构节点{
节点*prev;
节点*下一步;
int-val;
};
int main(){
节点*第一个_节点;
节点*活动节点;
节点*上一个节点;
第一个节点=上一个节点=NULL;
对于(int c=0;c<10;c=c+1){
Node*new_Node=(Node*)malloc(sizeof(Node));
if(新节点==NULL)
返回1;
新建_节点->val=c;
新建\u节点->上一个=上一个\u节点;
新建节点->下一步=空;
if(上一个节点)
上一个节点->下一个=新节点;
其他的
第一个\u节点=新的\u节点;
上一个节点=新的节点;
}
活动节点=第一个节点;
while(活动节点){
printf(“节点:%d\n”,活动节点->val);
活动节点=活动节点->下一步;
}
活动节点=第一个节点;
while(活动节点){
上一个节点=活动节点;
活动节点=活动节点->下一步;
自由(上一个节点);
}
返回0;
}

第一个节点->val=0指针未初始化。非常明亮且正确!谢谢!:)对于每个
free()
必须有一个以前的
malloc()
#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;
}