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
相关产品推荐
相关产品推荐

