C语言中字符数组无空终止符时printf输出的行为疑问
关于C语言字符数组初始化与
printf("%s")的行为分析 - 你判断这段代码属于未定义行为完全正确,那些称固定输出
Sca的资料并不严谨。 - 用字符串字面量初始化固定大小字符数组的规则是:如果数组长度小于字面量的字符数(不含结尾的
'\0'),编译器只会把字面量的前N个字符(N为数组大小)拷贝到数组中,不会自动添加空终止符。比如你写的char str[3] = "Scaler.";,数组里只会存入'S'、'c'、'a','\0'根本没有存储空间。 printf("%s")的工作逻辑是从传入地址开始逐个输出字符,直到遇到'\0'才停止。因为你的str数组里没有这个终止符,它会越界读取数组后的内存内容——这就是标准定义的未定义行为,输出结果完全不确定:可能刚好后续内存里有'\0'就只输出Sca,可能输出一串乱码,甚至程序直接崩溃都有可能。- 你问的“空终止符会存在于最后一个索引吗”:答案是不会。只有当数组大小大于等于字面量总长度(包含
'\0')时,编译器才会把'\0'加入数组;如果数组大小刚好等于字面量的字符数(不含'\0'),同样不会添加'\0'。所以你的代码里不可能稳定输出Sc,除非数组后恰好有'\0',但这是随机巧合,不是必然结果。
内容的提问来源于stack exchange,提问作者Blue Apricot
相关产品推荐
相关产品推荐

