C 中带有较短初始值设定项的字符串的 printf 表现得很奇怪

printf in C with strings that has shorter initializer behaves weird

所以我尝试制作字符数组并尝试使用它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char ** argv) {

    char str1[11] = "Yo! Angelo!~";  //total length of 12, initializer is shorter
    char str2[14] = "Yo! Angelo!233"; //total length of 14, initializer is same length
    char str3[60] = "Yo! Angelo!wwww"; //initializer is longer

    printf("%s"\n, str1);

}

编译器给我的警告是 initializer-string for array of chars is too long

我预计它只会给我 str1 的前 11 个字符,即 Yo! Angelo! 没有 '~'

但这是我将所有三个数组排成一行(第一个是前 11 个字符),因为这样

Yo! Angelo!Yo! Angelo!233Yo! Angelo!wwww(三弦全部砸在一起没有space)

当我将初始化程序的长度更改为 12(与字符串长度相同)时,同样的问题仍然存在

另外,当我尝试 printf("%s\n", str2) 时,它有类似的问题——它在一行中打印第二个和第三个字符串,中间没有任何内容

但是当我将它更改为 13 或更大时,它只按预期打印 str1。

这不是紧急情况,我知道我必须声明的字符串长度超过它的长度(在这种情况下超过 13),但我只是想知道为什么 printf 会做这样的时髦事情。

谢谢~

当您使用对于数组来说太长的字符串初始值设定项时,您会丢失尾随字符,包括尾随 NUL 终止符。所以你最终得到不包含字符串(没有 NUL 终止符)的数组(str1 和 str2),所以当你尝试将它作为字符串打印时,你会得到未定义的行为。具体来说,它会打印内存中数组之后发生的任何事情,结果证明是其他数组。