You need to enable JavaScript to run this app. C++ 给结构体成员指针赋值时触发Write access violation错误
优惠活动
大模型
产品
解决方案
定价
更多

C++ 给结构体成员指针赋值时触发Write access violation错误

写入访问违规根因定位
  • 值0xCCCCCCCC是MSVC Debug编译模式下,编译器为未初始化的结构体成员指针、栈指针填充的专属占位标记,该地址不属于进程可寻址的有效内存范围,对该地址执行写入操作必然触发访问违规。
  • 你的结构体中first_cell是仅声明、从未完成有效初始化的指针成员,初始值就是上述调试占位值,没有指向任何合法内存空间。
  • 原create()函数存在两处核心逻辑错误:
    1. 动态内存申请写法错误:new int[length * sizeof(int)]的入参是数组元素个数,而非字节长度,手动乘sizeof(int)会导致实际申请的元素数是预期的4倍,造成冗余内存浪费。
    2. 赋值逻辑完全偏离设计目的:你本意是将动态分配的数组首地址存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 05:24:00