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

未用指针时修改数组致main中int变量值异常,是特性还是编译器故障?

问题:为什么这段代码输出3而非预期的2?

我写的代码输出结果是3,但我并没有使用指针,输出结果难道不应该是2吗?有趣的是,若将代码中的数组a完全移除,输出结果就变为2。这是编程语言的特性还是编译器故障?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void hi(int a[], int n) {
    a[n] = 3;
    n++;
    return;
}

int main() {
    int n = 2, i;
    int a[2] = { 1, 2 };
    hi(a, n);
    printf("%d\n", n);
    return 0;
}

这不是编译器故障,也不是编程语言的特性,是你的代码触发了未定义行为。

具体原因如下:

  • 你在main函数里定义的数组a只有2个元素,合法下标是0和1。调用hi(a, n)时,n的值是2,所以a[n] = 3实际是访问a[2]——这已经超出了数组的合法范围,属于数组越界访问。
  • 在当前的编译器和运行环境下,数组a的内存空间之后,刚好就是main函数里变量n的存储位置。所以给a[2]赋值3,相当于直接修改了main里的n,导致最终输出3。
  • 当你移除数组a后,不存在越界访问的问题,hi函数里的n是局部变量,修改它不会影响main函数里的n,所以输出就是初始值2。

要注意:C语言中数组越界属于未定义行为,编译器和运行环境可以用任意方式处理这种情况——这次是覆盖了变量值,换个环境可能会直接崩溃、输出乱码,或者出现其他奇怪的结果,绝对不能依赖这种行为。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:35:21