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

为何这段无空终止符的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的读取逻辑在起作用。

关键逻辑拆解

  1. 局部变量的栈布局:C语言中main函数的局部变量存在栈上,绝大多数系统的栈是从高地址向低地址生长的——先定义的变量内存地址更高,后定义的变量地址更低。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:12:20