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

char数组传入函数退化后,printf为何能完整打印整个字符串?

问题解答:为什么printf能准确打印退化为指针的char数组?

代码示例

auto print_name(char* name) -> void
{
    printf("Name: %s", name);
}

int main(int argc, char const* argv[])
{
    char name[300] = "Uncle Roger";
    print_name(name);
}

运行输出:Name: Uncle Roger

疑问

我了解char数组在传入函数时会退化为指向首元素的指针(此处为首字符U的指针),且该过程会丢失数组大小,但为何printf函数仍能准确打印整个char数组?这是否是因为char数组是null terminated的缘故?

解答

对,你猜的完全没错——就是因为这个char数组是以空字符(\0)结尾的。

  • 当你用"Uncle Roger"这种字符串字面量初始化char数组时,C编译器会自动在字符串的最后加上一个\0(空终止符)。哪怕你定义的数组大小比实际字符串长度大(比如这里的300),数组中剩下的未使用空间也会被自动初始化为\0。
  • printf的%s格式符的工作逻辑很直接:从传入的指针指向的内存地址开始,逐个读取并打印字符,直到遇到\0才停止。它完全不需要知道数组的总大小,只靠这个终止符来判断字符串的结束位置。
  • 反过来,如果你的char数组没有\0作为终止符,printf就会顺着内存一直往后读,直到碰巧遇到一个\0才停下,这时候就会出现乱码,甚至触发内存越界的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:13:20