未用指针时修改数组致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
相关产品推荐
相关产品推荐

