You need to enable JavaScript to run this app. C++指针数组存储不同数值时输出全相同的原因与修正方法
优惠活动
大模型
产品
解决方案
定价
更多

C++指针数组存储不同数值时输出全相同的原因与修正方法

问题核心成因

你遇到的问题本质是指针存储的是内存地址,而非地址对应位置的数值快照。
你定义的myptr是全程唯一的全局int变量,内存中只有一块位置存储它的值。两次给ptr[0]、ptr[1]赋值时,存的都是这块唯一内存的地址——相当于给同一块内存起了两个别名。别名本身不会固定对应内存里的数值,只要myptr的值从3累加到5,两个指针指向的还是同一块物理内存,最后统一解引用时读到的自然都是myptr的最新值5,完全不会保留此前的历史数值3。

适配需求的调整方案

要实现你预期的“在指针数组中记录不同阶段的数值快照”效果,有两种可直接落地的实现思路,匹配不同的使用场景:

  • 方案1:为每个数组元素分配独立的存储内存
    不要让所有指针共享同一个myptr的地址,给每个指针数组元素绑定一块独立的int内存,把赋值瞬间myptr的数值复制到这块独立内存中,再让指针指向它。
    对应代码的修改点:
    // 第一次循环结束、给ptr[0]赋值时
    ptr[0] = new int;
    *ptr[0] = myptr; // 把当前myptr的值3复制到独立内存块
    
    // 第二次循环结束、给ptr[1]赋值时
    ptr[1] = new int;
    *ptr[1] = myptr; // 把当前myptr的值5复制到另一块独立内存块
    
    注意:通过new申请的动态内存,在程序退出前需要通过delete ptr[0]; delete ptr[1];释放,避免内存泄漏。
  • 方案2:直接用普通数组存数值,省去不必要的指针开销
    你的核心需求是“存储数值”,如果没有必须用指针数组的特殊场景,完全不需要定义指针类型的数组,直接用普通int数组存值即可,从根源上避免共享内存的问题:
    // 把原来的 int *ptr[MAX_N]; 替换成普通数组
    int val_arr[MAX_N];
    
    赋值时直接把当前myptr的值写入数组元素:
    // 第一次循环结束后
    val_arr[0] = myptr;
    // 第二次循环结束后
    val_arr[1] = myptr;
    
    最后循环输出时直接读取数组元素的值即可,没有动态内存管理的额外成本,也不会出现指向同一地址的问题,是最贴合需求的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 21:36:11