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

为何这段C语言数组越界代码未触发内存错误?

内存越界未触发错误的原因分析

你的代码里存在明确的内存越界:第二个参数"Hello"是字符串字面量,内存中实际存储为H e l l o \0,共6个字节,但调用string_compare时指定了len=10,循环会访问w2[5]到w2[9],超出了该字符串的内存范围。

为什么没触发内存错误?核心在于C语言中内存越界属于未定义行为:C标准对这种行为没有任何强制规定,程序可能崩溃、输出错误结果,也可能像你遇到的这样“正常运行”,完全取决于当前程序的内存布局和操作系统的内存管理机制。

具体来说有几个关键因素:

  • 字符串字面量一般被编译器放在只读数据段(.rodata),相邻的内存区域可能是其他字面量、填充的空字节或者未被使用的内存页。如果越界访问的是这些进程有权限读取的区域,就不会立刻触发段错误。
  • 你只是读取越界内存,没有写入操作。写入越界内存触发崩溃的概率远高于读取,只要地址在进程的可访问范围内,读取操作就不会被操作系统拦截。
  • 这种“正常”是完全不可靠的——后续代码修改、编译器版本更换、操作系统环境变化,都可能让原本正常的程序突然崩溃,或者出现难以排查的逻辑错误。

修复思路很明确:要么在函数内部用strlen获取两个字符串的实际长度,取较小值作为循环上限;要么由调用方保证传入的len不超过两个字符串的有效长度。

内容的提问来源于stack exchange,提问作者Wen Sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 12:51:35