为何该链表初始化代码无法正常运行?
问题分析:初始化链表节点时的崩溃原因及修复方案
嘿,我一眼就看出问题出在哪了——你这段代码里的指针根本没指向有效的内存空间,直接解引用野指针当然会报错啦!
核心问题拆解
在main函数里,你定义了node n;,但这个node本质是struct node*类型的指针,它被声明后没有被初始化,指向的是内存里的随机地址(也就是我们常说的「野指针」)。当你调用mklist(&n),并在函数里执行(*n)->times = 0;这类操作时,你试图修改一个随机内存地址的内容,这是操作系统绝对不允许的,直接触发错误。
修复方案:先分配内存再初始化
要创建一个有效的链表节点,必须先用malloc为它分配内存空间,确保指针指向合法的内存区域。修复后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { int times; char name[100]; char number[100]; struct node* next; }; typedef struct node* node; void mklist(node* n) { // 第一步:为节点分配内存 *n = (node)malloc(sizeof(struct node)); // 必须检查内存分配是否成功 if (*n == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 第二步:初始化节点成员 (*n)->times = 0; strcpy((*n)->name, "null"); strcpy((*n)->number, "null"); (*n)->next = NULL; } int main(void) { node n; mklist(&n); // 可以加些输出验证初始化结果 printf("times: %d\n", n->times); printf("name: %s\n", n->name); printf("number: %s\n", n->number); printf("next pointer: %p\n", n->next); // 别忘了用完内存要释放,避免内存泄漏 free(n); return 0; }
额外说明:如果是想创建空链表
如果你本来的目的是创建一个空链表(也就是没有任何节点,头指针直接指向NULL),那根本不需要调用mklist,直接初始化指针就行:
int main(void) { node n = NULL; // 头指针为NULL,代表空链表 // 后续可以写其他函数来添加节点 return 0; }
内容的提问来源于stack exchange,提问作者Rafael Santos
相关产品推荐
相关产品推荐

