程序执行`t[i]->s=x;`语句时崩溃,求助原因排查分析
问题分析与修复方案
哦,这个问题我太熟悉了——你这里遇到的是野指针非法访问导致的程序崩溃,咱们一步步拆解清楚:
核心问题所在
你定义的tree t[n]是一个指针数组,数组里的每个元素都是struct tnode*类型的指针。但你只声明了这个数组,却没有给数组里的每个指针分配对应的结构体内存空间。这时候这些指针的值是随机的(也就是我们常说的「野指针」),当你执行t[i]->s=x;时,相当于在尝试读写一块完全不属于你的内存区域,操作系统会直接触发崩溃来阻止这种非法操作。
具体修复步骤
- 为每个指针分配结构体内存
在给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; }
- 记得释放内存(避免泄漏)
程序结束前,要把之前分配的内存逐一释放,避免内存泄漏问题:
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
相关产品推荐
相关产品推荐

