使用多个结构体指针导致程序运行崩溃的问题咨询
问题原因:未初始化的野指针
你这段代码的核心问题是指针未初始化,也就是所谓的「野指针」问题:
a *a1, *a2;只是声明了两个指向a类型的指针变量,但并没有给它们分配有效的内存空间,这两个指针当前指向的是内存中的随机地址。- 当你执行
a1->x = 3;时,纯粹是运气好——刚好这个随机地址对应的内存区域没有被系统保护,也没有覆盖其他程序数据,所以看似能正常输出3,但这属于未定义行为,完全不可靠。 - 到操作
a2->x = 2;时,这个野指针指向的内存区域可能是系统禁止写入的地址,或者覆盖了程序的关键数据,直接导致程序运行异常,自然没法正常输出2。
修复方案
要解决这个问题,你需要给指针分配有效的内存,两种常见方式:
- 使用
new在堆上分配内存:
#include <iostream> using namespace std; typedef struct A{ int x; }a; int main() { a *a1 = new a; // 分配堆内存 a *a2 = new a; a1->x = 3; cout << a1->x << endl; a2->x = 2; cout << a2->x << endl; // 释放堆内存,避免内存泄漏 delete a1; delete a2; return 0; }
- 使用栈上的结构体,再取地址:
#include <iostream> using namespace std; typedef struct A{ int x; }a; int main() { a obj1, obj2; // 栈上创建结构体实例 a *a1 = &obj1; a *a2 = &obj2; a1->x = 3; cout << a1->x << endl; a2->x = 2; cout << a2->x << endl; return 0; }
内容的提问来源于stack exchange,提问作者setos9871695
相关产品推荐
相关产品推荐

