我有这段代码
#include<stdio.h>
#include<string.h>
int main(void)
{
size_t i;
char arr[5] = "";
for(i = 0; i < 5; i++)
printf("%c ", arr[i]);
puts("");
memset(arr, '0', 5);
for(i = 0; i < 5; i++)
printf("%c ", arr[i]);
return 0;
}
为什么第一个printf只打印空格而第二个打印零
为什么会这样?
答案 0 :(得分:-1)
如果使用小于数组的字符串文字初始化数组,则字符串(包括尾随NUL)将被复制到数组中。然后,将根据用于初始化具有静态存储持续时间的变量的相同规则来初始化任何多余的元素,char
为0
。 (q.v. C99 6.7.8 / 21)
第一个printf循环使用%c
一次打印一个字符。
因此,当您将数组初始化为""
(相当于{'\0'}
)时,数组将使用全零来初始化:来自null终止符的第一个零,以及其他因为这是默认值对于具有静态持续时间的char
。由于小数值为零表示NUL的ASCII值,因此printf打印... NUL,通常显示为空格。
对于第二个,您将数组设置为ASCII 0,因为您将所有值设置为0
,这是十六进制值0x30(我忘记了十进制转换)。因此,由于您正在打印%c
,它将打印ASCII 0。
现在,如果您更改第一个printf以打印%d
而不是%c
,那么它将打印存储在数组中的整数值,这将全为零。如果您更改第二个printf以打印%x
,那么它将打印一堆0x30。
了解%c
,%d
,%x
和其他printf标记之间的差异,以及它们的行为方式。