为什么这段使用二级指针的C代码输出1而非预期的0?
代码输出为1的原因解析
核心问题出在p[1] = p[0]这行代码,它让p[0]和p[1]两个指针指向了完全相同的一块堆内存,而非独立的两个一维数组,后续循环赋值会产生覆盖效果,具体执行逻辑如下:
完整执行流程拆解
- 内存申请阶段:
- 首先为二级指针
p申请了2个int*大小的空间,即p包含p[0]、p[1]两个指针元素 - 为
p[0]申请了可存储2个int值的连续堆空间 - 执行
p[1] = p[0]时,直接把p[0]的内存地址赋值给p[1],此时两个指针指向完全相同的内存区域,没有独立的存储空间
- 首先为二级指针
- 循环赋值阶段:
- 当
i=0时:j=0:p[0][0] = 0+0 = 0,内存第一个位置值为0j=1:p[0][1] = 0+1 = 1,内存第二个位置值为1
- 当
i=1时:- 因为
p[1]和p[0]指向同一块内存,所以对p[1][j]的赋值就是修改p[0]指向的内存内容 j=0:p[1][0] = 1+0 = 1,直接把之前p[0][0]的0覆盖为1j=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
相关产品推荐
相关产品推荐

