为何这段无空终止符的C代码输出顺序不符合预期?
问题分析与解答
先看这段存在问题的C代码:
#include <stdio.h> int main() { int aa = 0; char c = 'd'; char a[4] = "hiii"; char b[4] = {'d','e','f','g'}; char d[2] = "sp"; printf(b); return 0; }
你疑惑的核心是:为啥输出是"defghiiid"而不是预期的"defgsp"?本质是栈的生长方向和printf的读取逻辑在起作用。
关键逻辑拆解
- 局部变量的栈布局:C语言中main函数的局部变量存在栈上,绝大多数系统的栈是从高地址向低地址生长的——先定义的变量内存地址更高,后定义的变量地址更低。
- printf的读取规则:当传入无空终止符
'\0'的字符数组时,printf会从数组起始地址开始,持续向高地址方向读取内存字节,直到碰到第一个'\0'才停止。
具体内存布局(地址从高到低)
int aa(4字节,值为0)→ char c(1字节,值'd')→ char a[4](4字节,"hiii")→ char b[4](4字节,"defg")→ char d[2](2字节,"sp")
输出过程详解
调用printf(b)时:
- 先读取
b数组的4个字符:d e f g - 因
b无'\0',printf继续向高地址读取,接下来是a数组的4个字符:h i i i a同样无'\0',继续读高地址,碰到char c的d- 再往高地址读,就是
int aa的内存,其中包含字节0(即'\0'),printf到此停止
把这些字符连起来,就是defghiiid,和你看到的输出一致。
为啥碰不到d数组?
d数组是最后定义的,在栈上的地址比b数组低,而printf只会从b的起始地址往高地址方向读,不会往低地址走,所以永远读不到d数组的内容。
内容的提问来源于stack exchange,提问作者Legends Andreas
相关产品推荐
相关产品推荐

