C语言链表存储含字符串结构体数据运行崩溃问题排查
链表存储含字符串结构体时运行崩溃的问题分析与修复
嘿,我看到你在尝试用链表存储带字符串的结构体时遇到了运行崩溃的问题,咱们来仔细拆解代码里的问题出在哪儿。
首先先把你的代码贴出来方便分析:
typedef struct data{ int vertex; char url[10]; }Data; typedef struct Node { Data *v; struct Node *next; } Node; Node *makeNode(Data n) { Node *new_node = (Node*)malloc(sizeof(Node)); assert(new_node != NULL); new_node->v->vertex = n.vertex; strcpy(new_node->v->url,n.url); new_node->next = NULL; return new_node; } int main(){ Data n1; n1.vertex = 1; strcpy(n1.url,"a1"); Node *a = makeNode(n1); }
核心问题:野指针访问导致崩溃
你在makeNode函数里只给Node结构体本身分配了内存,但Node里的v是一个Data*类型的指针——这个指针此时是未初始化的野指针,根本没有指向一块有效的内存空间。当你直接通过new_node->v->vertex或者strcpy(new_node->v->url, n.url)去访问它的成员时,程序就会因为非法内存访问而崩溃。
两种修复方案
方案1:将Node中的v改为直接存储Data结构体
如果你的结构体大小不大,直接把v定义成Data类型而不是指针会更简单,也不用额外管理指针内存:
typedef struct data{ int vertex; char url[10]; }Data; // 修改Node结构体,v不再是指针 typedef struct Node { Data v; struct Node *next; } Node; Node *makeNode(Data n) { Node *new_node = (Node*)malloc(sizeof(Node)); assert(new_node != NULL); // 直接访问v的成员,不需要指针解引用 new_node->v.vertex = n.vertex; strcpy(new_node->v.url, n.url); new_node->next = NULL; return new_node; }
方案2:给v指针分配内存
如果你坚持要用指针来存储Data,那必须在使用v之前给它分配一块内存空间:
typedef struct data{ int vertex; char url[10]; }Data; typedef struct Node { Data *v; struct Node *next; } Node; Node *makeNode(Data n) { Node *new_node = (Node*)malloc(sizeof(Node)); assert(new_node != NULL); // 给Data指针分配内存 new_node->v = (Data*)malloc(sizeof(Data)); assert(new_node->v != NULL); // 检查内存分配是否成功 // 现在可以安全访问v的成员了 new_node->v->vertex = n.vertex; strcpy(new_node->v->url, n.url); new_node->next = NULL; return new_node; }
⚠️ 注意:用这种方案的话,后续销毁链表的时候,一定要先释放new_node->v的内存,再释放new_node本身,不然会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Leshen Zhu
相关产品推荐
相关产品推荐

