You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该链表初始化代码无法正常运行?

问题分析:初始化链表节点时的崩溃原因及修复方案

嘿,我一眼就看出问题出在哪了——你这段代码里的指针根本没指向有效的内存空间,直接解引用野指针当然会报错啦!

核心问题拆解

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:45