打印0初始化数组元素的值什么都不打印,为什么?

Ton*_*ous 2 c printf char format-specifiers

我必须将char数组初始化为0.我做到了

char array[256] = {0};
Run Code Online (Sandbox Code Playgroud)

我想检查它是否有效,所以我尝试了它

#include <stdio.h>

int main()
{
    char s[256] = {0};
    printf("%c\n", s[10]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在编译并运行它之后,命令行输出什么都没有显示.

我错过了什么?也许我以错误的方式初始化了数组?

Sou*_*osh 9

TL; DR - %c是字符表示.使用%d看十进制0值.

相关的,来自C11章节§7.21.6.1,(强调我的)

c          如果不存在l长度修饰符,则将int参数转换为a unsigned char,并写入生成的字符.

仅供参考,请参阅可打印值列表.

也就是说,对于托管环境,int main()应该int main(void)至少符合标准.


Per*_*-lk 5

您将打印s[10]为字符(%c),并且数字值为s[10]is 0,表示字符\0,表示字符串结尾且没有文本表示.因此你没有看到任何东西.

如果要查看数值而不是字符值,请使用%d将其打印为十进制(整数)数字:

printf("%d\n", s[10]);
Run Code Online (Sandbox Code Playgroud)

请注意,字符串的结尾与行尾不同,如您的一条评论中所述.字符串结尾表示字符序列上的任何字符串操作必须在第一个字符串序列\0到达时停止.如果字符序列后面还有其他内容\0,则不会打印,因为字符串操作会在第一个\0字符上停止.

但是,行尾是普通字符,其视觉效果是指终端或文本编辑器在新行的行尾之后打印下一个字符.

如果你想要一个带有行尾字符的向量(并打印出来),你必须移动向量并填充它:

char s[256];
int i;

for (i = 0; i < 256; ++i)
     s[i] = '\n';

printf("%c\n", s[10]);
Run Code Online (Sandbox Code Playgroud)

行尾字符(\n)的ASCII(十进制/数字)值为12,因此,以下代码段将是等效的:

char s[256];
int i;

for (i = 0; i < 256; ++i)
     s[i] = 12;

printf("%c\n", s[10]);
Run Code Online (Sandbox Code Playgroud)

但这不起作用(它不会打印新行):

char s[256] = {'\n'}; // or {12};

printf("%c\n", s[10]);
Run Code Online (Sandbox Code Playgroud)

因为{'\n'}is 的效果是分配\n给数组的第一个元素,剩余的255个字符用值0填充,无论你在哪种类型的数组(char[],int[]或者其他).如果你写一对空括号{},所有元素都将为0.

所以,这两个陈述是等价的:

char s[256] = {}; // Implicit filling to 0.
char s[256] = {0}; // Implicit filling to 0 from the second element.
Run Code Online (Sandbox Code Playgroud)

但是,没有定义数组:

char s[256];
Run Code Online (Sandbox Code Playgroud)

数组未填充(未初始化),因此,每个元素都s将包含任何内容,直到您使用值填充它,例如,使用for.

我希望通过所有这些例子,您可以了解全局.