C++报read access violation 0xCCCCCCCC错误无法显示姓名列表
问题根因
- 你定义的
Person* person[5]是存储5个Person类指针的数组,所有指针仅完成声明、未指向实际分配的Person对象内存,属于野指针。直接访问person[i]->name时会触发读取访问权限冲突,报错的0xCCCCCCCC正是Windows调试模式下未初始化栈内存的特征标识,和你判断的未初始化指针问题一致。 - 赋值逻辑存在笔误:循环内写死为
n[1],会导致所有姓名都取数组第二个值,需要改为n[i]才能依次赋值5个不同姓名。
修复后可运行代码
#include <iostream> #include <string> using namespace std; class Person { public: string name; }; void createPerson(Person* person[]); int main() { Person* person[5]; createPerson(person); for (int i = 0; i < 5; i++) { cout << person[i]->name << endl; } // 释放堆内存避免泄漏 for (int i = 0; i < 5; i++) { delete person[i]; } return 0; } void createPerson(Person* person[]) { string n[5] = { "Dwayne Johnson", "Connor McGregor", "SpongeBob","BatMan", "Ash Ketchum" }; for (int i = 0; i < 5; i++) { // 先为每个指针分配实际的Person对象内存 person[i] = new Person(); // 改用下标i取对应姓名 person[i]->name = n[i]; } }
核心修改点说明
- 在给
person[i]->name赋值前,先通过new Person()为每个指针分配堆上的Person对象内存,指针指向合法内存后再操作成员变量就不会触发访问冲突。 - 把赋值的
n[1]改为n[i],保证每个Person对象取到对应位置的姓名。 - 新增了内存释放逻辑,避免堆内存泄漏。
内容的提问来源于stack exchange,提问作者still_learning
相关产品推荐
相关产品推荐

