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

程序执行`t[i]->s=x;`语句时崩溃,求助原因排查分析

问题分析与修复方案

哦,这个问题我太熟悉了——你这里遇到的是野指针非法访问导致的程序崩溃,咱们一步步拆解清楚:

核心问题所在

你定义的tree t[n]是一个指针数组,数组里的每个元素都是struct tnode*类型的指针。但你只声明了这个数组,却没有给数组里的每个指针分配对应的结构体内存空间。这时候这些指针的值是随机的(也就是我们常说的「野指针」),当你执行t[i]->s=x;时,相当于在尝试读写一块完全不属于你的内存区域,操作系统会直接触发崩溃来阻止这种非法操作。

具体修复步骤

  1. 为每个指针分配结构体内存
    在给t[i]的成员赋值之前,必须先用malloc为每个指针申请合法的内存空间,修改后的循环代码如下:
scanf("%d",&n);
tree t[n];
for(i=0;i<n;i++){
    scanf("%d",&x);
    // 为当前指针分配结构体大小的内存
    t[i] = (tree)malloc(sizeof(struct tnode));
    // 养成好习惯:检查内存分配是否成功
    if(t[i] == NULL) {
        printf("内存分配失败,程序退出\n");
        exit(1);
    }
    t[i]->s=x;
    t[i]->next=NULL;
    t[i]->know=false;
}
  1. 记得释放内存(避免泄漏)
    程序结束前,要把之前分配的内存逐一释放,避免内存泄漏问题:
for(i=0;i<n;i++){
    free(t[i]);
}

额外小提示

如果你的编译器不支持C99标准的变长数组(tree t[n]),那你还需要把数组本身也改成动态分配的形式:

scanf("%d",&n);
// 动态分配指针数组
tree *t = (tree)malloc(n * sizeof(tree));
if(t == NULL) {
    printf("数组内存分配失败\n");
    exit(1);
}
// 后续循环代码同上...
// 最后先释放每个结构体,再释放数组本身
for(i=0;i<n;i++){
    free(t[i]);
}
free(t);

内容的提问来源于stack exchange,提问作者CnlA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:39