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

C语言字符数组越界访问输出异常字符的原因求解

C语言数组越界访问出现原字符串内容的底层原理

核心前提

C语言语法本身不提供数组边界检查,超出数组合法下标范围的访问属于未定义行为:只要访问的内存地址属于当前进程的合法地址空间,程序就不会直接崩溃,输出结果由当前内存的实际存储内容决定。

代码前置问题

你初始化str数组的代码存在隐含问题:

char str[5] = "Hello";

字符串字面量"Hello"实际包含6个字符(末尾隐含结束符'\0'),你指定数组长度为5,编译器只会复制前5个字符H e l l o到str中,不会自动补'\0'。这导致你第一个遍历字符串的while循环会越界访问str[5]的位置才找到结束符,最终循环结束时i=5,为后续操作埋下了越界隐患。

栈内存布局是该现象的核心原因

函数内的局部变量默认分配在栈内存区域,栈的生长方向为从高地址向低地址分配:先定义的变量会被分配到更高的内存地址,后定义的变量分配到更低的内存地址。
你的两个数组在当前运行环境的栈上内存排布(从低地址到高地址)大致如下:

偏移量(相对于rev数组首地址)所属区域存储内容
-5 ~ -1栈其他区域程序运行残留的无用数据
0 ~ 4rev[0]~rev[4]反转后得到的o l l e H
5栈对齐填充位你运行结果中出现的空字符
6str[1]原字符串的e
7str[2]原字符串的l
8str[3]原字符串的l
9str[4]原字符串的o
10 ~ 13栈其他区域清零的内存/填充数据
14栈变量残留区恰好存储了H对应的ASCII值
15及以上栈其他区域乱码数据

你用rev[k]访问超过下标4的位置时,实际已经读到了更高地址的str数组内存空间,所以会输出原字符串的内容;k为负数时是读取rev数组更低地址的栈残留数据,所以输出乱码,这些都是当前环境内存布局的正常体现。

注意

这种越界访问的结果完全不具备通用性,不同编译器、编译选项、运行环境下的输出可能完全不同,实际开发中必须严格避免数组越界访问。


内容的提问来源于stack exchange,提问作者Nagraju Kasarla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:24:04