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

为什么这段使用二级指针的C代码输出1而非预期的0?

代码输出为1的原因解析

核心问题出在p[1] = p[0]这行代码,它让p[0]和p[1]两个指针指向了完全相同的一块堆内存,而非独立的两个一维数组,后续循环赋值会产生覆盖效果,具体执行逻辑如下:

完整执行流程拆解

  • 内存申请阶段:
    1. 首先为二级指针p申请了2个int*大小的空间,即p包含p[0]、p[1]两个指针元素
    2. 为p[0]申请了可存储2个int值的连续堆空间
    3. 执行p[1] = p[0]时,直接把p[0]的内存地址赋值给p[1],此时两个指针指向完全相同的内存区域,没有独立的存储空间
  • 循环赋值阶段:
    1. 当i=0时:
      • j=0:p[0][0] = 0+0 = 0,内存第一个位置值为0
      • j=1:p[0][1] = 0+1 = 1,内存第二个位置值为1
    2. 当i=1时:
      • 因为p[1]和p[0]指向同一块内存,所以对p[1][j]的赋值就是修改p[0]指向的内存内容
      • j=0:p[1][0] = 1+0 = 1,直接把之前p[0][0]的0覆盖为1
      • j=1:p[1][1] = 1+1 = 2,把之前p[0][1]的1覆盖为2
  • 输出阶段:
    此时p[0][0]的数值已经被覆盖为1,所以最终输出结果为1

修复方法(得到预期输出0)

如果要实现你预期的二维数组赋值效果,只需要给p[1]单独申请独立的内存空间,把p[1] = p[0];替换为p[1] = (int*)malloc(2*sizeof(int));即可,此时两个一维数组内存独立,赋值不会互相覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:02