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

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数组的内容,核心原因是数组越界写入破坏了相邻变量的内存空间,具体细节如下:

  1. 局部变量的栈内存布局:C语言中,函数内的局部变量(比如这里的x和y)会被分配在栈内存中。栈内存通常从高地址向低地址生长,编译器会将相邻定义的局部变量连续排布。在这个案例的编译环境中,y的内存地址比x更低,两者的内存空间是连续的。
  2. 越界写入的影响:y是长度为6的字符数组,合法下标范围是0~5,y[7]已经超出了y的内存边界。执行y[7]='A'时,这个写入操作会覆盖栈中y数组之后的内存位置——刚好对应x数组的第2个元素(x[1],原内容是'2')。
  3. C语言的边界检查缺失:C语言本身不会在运行时检查数组下标是否越界,所以这种非法操作不会被编译器拦截,只会触发未定义行为。这个案例的输出只是特定环境下的表现,换个编译器、操作系统或优化选项,可能出现程序崩溃、其他变量被修改等不同结果。

内容的提问来源于stack exchange,提问作者Amos Hunter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:36:23