C语言数组越界写入致邻接变量被修改的原因咨询
C语言数组越界写入导致的意外内存修改
代码示例
#include <stdio.h> main () { char x[6] = "12345\0"; char y[6] = "67890\0"; y[7]='A'; printf("X: %s\n",x); printf("Y: %s\n",y); }
程序输出
X: 1A345
Y: 67890
问题原因解析
这段代码里给y[7]赋值'A'却修改了x数组的内容,核心原因是数组越界写入破坏了相邻变量的内存空间,具体细节如下:
- 局部变量的栈内存布局:C语言中,函数内的局部变量(比如这里的
x和y)会被分配在栈内存中。栈内存通常从高地址向低地址生长,编译器会将相邻定义的局部变量连续排布。在这个案例的编译环境中,y的内存地址比x更低,两者的内存空间是连续的。 - 越界写入的影响:
y是长度为6的字符数组,合法下标范围是0~5,y[7]已经超出了y的内存边界。执行y[7]='A'时,这个写入操作会覆盖栈中y数组之后的内存位置——刚好对应x数组的第2个元素(x[1],原内容是'2')。 - C语言的边界检查缺失:C语言本身不会在运行时检查数组下标是否越界,所以这种非法操作不会被编译器拦截,只会触发未定义行为。这个案例的输出只是特定环境下的表现,换个编译器、操作系统或优化选项,可能出现程序崩溃、其他变量被修改等不同结果。
内容的提问来源于stack exchange,提问作者Amos Hunter
相关产品推荐
相关产品推荐

