C++ 给结构体成员指针赋值时触发Write access violation错误
写入访问违规根因定位
- 值
0xCCCCCCCC是MSVC Debug编译模式下,编译器为未初始化的结构体成员指针、栈指针填充的专属占位标记,该地址不属于进程可寻址的有效内存范围,对该地址执行写入操作必然触发访问违规。 - 你的结构体中
first_cell是仅声明、从未完成有效初始化的指针成员,初始值就是上述调试占位值,没有指向任何合法内存空间。 - 原
create()函数存在两处核心逻辑错误:- 动态内存申请写法错误:
new int[length * sizeof(int)]的入参是数组元素个数,而非字节长度,手动乘sizeof(int)会导致实际申请的元素数是预期的4倍,造成冗余内存浪费。 - 赋值逻辑完全偏离设计目的:你本意是将动态分配的数组首地址存入
first_cell,但代码写为*first_cell = *arr——本质是尝试向未初始化的first_cell指向的非法地址,写入arr的第一个元素值,完全没有完成“将数组首地址绑定到first_cell”的核心动作。
- 动态内存申请写法错误:
修正后的可运行实现
struct Array { int length = 5; // 给first_cell增加默认空指针初始化,从根源避免调试模式下的占位值问题 int *first_cell = nullptr; void create() { // 按元素个数申请动态数组内存,无需手动计算字节长度 int *arr = new int[length]; // 直接将arr的地址值赋值给first_cell,不提前解引用指针 first_cell = arr; } // 配套内存释放逻辑,匹配new[]申请的堆内存,避免内存泄漏 void destroy() { delete[] first_cell; first_cell = nullptr; } void random_fill() { int k; srand(5); for (k = 0; k < length; k++) { first_cell[k] = rand() % 10; printf("| %d", first_cell[k]); } } };
修改要点说明:
- 给
first_cell设置默认空指针初始值,消除未初始化指针带来的非法访问隐患- 修正动态内存申请的参数逻辑,避免冗余内存分配
- 修正指针赋值逻辑:直接传递数组首地址,不对未绑定的指针执行解引用写入操作
- 补充对应
delete[]的释放方法,符合C++动态内存的配对申请释放规则
内容的提问来源于stack exchange,提问作者Aniki
相关产品推荐
相关产品推荐

