未以空字符终止的char数组在两种声明场景下的行为疑问
未以空字符终止的char数组两种声明方式的实际行为分析
首先明确核心前提:C语言中printf的%s格式化输出要求传入的字符序列必须以\0(空字符)终止,否则会从数组起始地址开始持续读取内存,直到遇到\0为止,这属于未定义行为——具体表现完全依赖编译器、内存布局等环境因素,不能被预期。
结合你的代码和输出,分两种情况拆解:
1. 自动推导大小的数组:char str1[]={'R','O','N'};
这个数组的大小会被编译器自动推导为3,刚好容纳初始化的三个字符,没有额外空间存储\0。你这次输出RON完全是巧合:数组后面的内存区域恰好第一个字节就是\0,或者后续读取到的是不可打印的控制字符(不会显示乱码)。
如果换个编译环境、调整代码上下文(比如在数组前/后添加其他变量),很可能会输出RON加上一堆随机乱码,甚至触发程序崩溃——因为它会越界读取不属于数组的内存,而这部分内存的内容是不可控的。
2. 指定固定大小的数组:char str2[5]={'R','O','N'};
这种情况的输出正常是有确定原因的:C语言规定,当你只初始化数组的部分元素时,未被显式初始化的元素会被自动初始化为0(也就是\0)。
你的str2大小为5,前3个元素被设为'R'、'O'、'N',剩下的2个元素(索引3和4)会被编译器自动填充为\0。所以当printf用%s输出时,读取到索引3的\0就会停止,自然输出RON。这种情况不属于未定义行为,是符合C语言初始化规则的确定行为。
你的代码示例
#include<stdio.h> void main() { char str1[]={'R','O','N'}; char str2[5]={'R','O','N'}; printf("String :-%s\n",str1); printf("String :-%s\n",str2); }
输出结果
String :-RON String :-RON
内容的提问来源于stack exchange,提问作者Abhishek Bhandari
相关产品推荐
相关产品推荐

