You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用解引用操作符操作动态内存时访问异常问题咨询

问题原因分析

核心原因

你的问题出在第一个循环直接修改了foo指针本身的指向:

  • foo最开始指向你申请的3个int类型动态数组的首地址
  • 第一个循环每次执行foo++,都会让foo向后偏移1个int的字节长度,循环执行3次退出后,foo已经指向了数组末尾之外的非法内存区域,不再持有原动态数组的首地址
  • 第二个循环执行*(foo+i)时,是基于已经偏移到非法位置的foo做地址计算,访问的根本不是你之前写入数据的内存区域,自然读不到正确值。

第二种写法正常的原因

当你用std::cin >> foo[i]替换原有写入逻辑时,全程都没有修改foo本身的指向,foo一直持有动态数组的首地址:

  • 写入时的foo[i]等价于*(foo + i),是基于首地址做偏移访问,不会改变foo本身的值
  • 第二个循环的读取逻辑同样是基于原首地址做偏移,访问的是正确的内存地址,所以运行正常。

修复方案

如果你要保留指针自增的写入逻辑,不要直接操作原foo指针,可以引入临时指针遍历:

#include <iostream>

int main()
{
    int* foo;
    foo = new (std::nothrow) int[3];
    // 新增临时指针用于遍历,不修改原foo的指向
    int* p = foo;
    int temp;
    for (int i = 0; i != 3; i++)
    {
        std::cin >> temp;
        *p = temp;
        p++;
    }

    for (int i = 0; i != 3; i++)
        std::cout << *(foo+i) << std::endl;

    // 不要忘记释放动态申请的内存
    delete[] foo;
    return 0;
}

另外要注意:你原代码没有释放动态申请的数组,会造成内存泄漏,最终要加上delete[] foo释放资源。

内容的提问来源于stack exchange,提问作者meysamimani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:57:03