C++指针与结构体代码报错求助:非法指令问题排查
结构体指针未初始化导致非法指令的问题排查
你的代码核心问题是未初始化结构体中的指针成员:
- 你用
new pnt给指针p分配了合法的内存空间,所以p->key = 1是没问题的。 - 但
p->key0是一个未赋值的指针,它指向内存中的随机地址,直接通过它访问key成员,相当于读写一块不属于你的内存区域,这就触发了编译器提示的“非法指令”(本质是内存访问违规的未定义行为)。
两种修复方案
方案1:给key0动态分配内存
给key0也分配合法的结构体内存,让它指向有效的对象:
#include <iostream> using namespace std; typedef struct point{ int key; struct point * key0; } pnt; int main() { pnt * p = new pnt; p->key = 1; // 先为key0分配内存,使其指向合法的结构体实例 p->key0 = new pnt; p->key0->key = 2; // 验证赋值结果 cout << "p->key: " << p->key << endl; cout << "p->key0->key: " << p->key0->key << endl; // 释放动态分配的内存,避免内存泄漏 delete p->key0; delete p; return 0; }
方案2:让key0指向已存在的栈对象
如果不需要动态分配,可以让key0指向一个栈上的结构体对象:
#include <iostream> using namespace std; typedef struct point{ int key; struct point * key0; } pnt; int main() { pnt * p = new pnt; p->key = 1; // 声明一个栈上的结构体对象 pnt obj; // 让key0指向这个已存在的对象 p->key0 = &obj; p->key0->key = 2; cout << "p->key: " << p->key << endl; cout << "p->key0->key: " << p->key0->key << endl; // 只需要释放p的内存,栈对象会自动销毁 delete p; return 0; }
注意事项
- 动态分配的内存记得用
delete释放,否则会造成内存泄漏;如果是多层指针,要按分配顺序反向释放(先释放key0,再释放p)。 - 任何指针在使用前都必须确保它指向合法的内存空间,未初始化的指针是C++中常见的内存错误来源。
内容的提问来源于stack exchange,提问作者deomanu01
相关产品推荐
相关产品推荐

