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

C指针内存访问疑问:代码结果为8但数组无该值求解释

问题分析:数组越界导致的未定义行为

先拆解代码中的关键计算和指针逻辑:

  1. 计算括号内的数值:
    表达式9 - 2 * 3 + 1遵循C语言运算符优先级,先算乘法2*3=6,再依次计算减法和加法,最终结果为4。

  2. 理解指针p的指向:
    int(*p)[4] = a; 定义了一个指向4个int元素构成的数组的指针,p初始指向二维数组a的第一行(即a[0])。

  3. 逐步解析目标表达式:
    目标表达式简化后为(*(*p + 4) + 2),拆解步骤如下:

    • *p 解引用p得到a[0],数组名a[0]会隐式退化为指向a[0][0]的int*指针。
    • *p + 4 将该指针向后偏移4个int长度,此时指针指向a[0][4]——但a[0]仅包含4个元素(索引0~3),这已经触发数组越界访问。
    • *(*p + 4) 对越界地址解引用,读取的是该内存位置的随机垃圾值(C标准将这种行为定义为未定义行为,结果不可预测)。
    • 最后给这个垃圾值加2,就得到了你看到的结果8。

结论:8并非数组a中的元素,而是越界访问内存获取的垃圾值与2相加的结果,核心原因是数组越界引发的未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:25