C - 打印未定义的数组元素不会给我带来垃圾
C - Printing undefined array elements isn't giving me junk
我有一个为 C 指针练习编写的小程序。我只是获取一个 char 数组并使用指针反向打印它。有用。但是,我不明白为什么会这样。因为我在元素 9 开始 for 循环,它不应该在到达 "sdrow" 之前打印 5 个未定义的元素(根据我的经验,通常是随机的垃圾字符)吗?我觉得我应该更多地过滤输出。
int main(void)
{
char sentence[10] = "words";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%c", *(ptr+i));
}
puts("");
return 0;
}
输出:
sdrow
当您初始化数组并且初始化程序提供的元素少于数组中的元素时,剩余元素将被初始化为零:
int a[3] = { 1 }; // same as { 1, 0, 0 }
char s[4] = "ab"; // same as { 'a', 'b', 0, 0 }
换句话说,您的代码在打印五个字母之前打印了五个空字节。
(您可以通过将输出重定向到文件并查看文件大小轻松地看到这一点。)
当你初始化一个固定大小的数组时,c 会自动用零填充任何未指定的元素。 C 风格字符串将这些零视为空字符,这也是字符串终止字符。
所以第一组迭代打印一个空字符,然后他们开始打印实际字符。
数组的其余部分由编译器用零初始化,这就是为什么你什么都看不到的原因:
int main(void)
{
char sentence[10] = "words";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%02x", *(ptr+i));
}
puts("");
return 0;
}
但是你不应该依赖这个,因为行为是未定义的。如果您使用的是指针,您会看到一些不同的东西:
int main(void)
{
char *sentence = "words";
char *other ="more";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%c", *(ptr+i));
}
puts("");
return 0;
}
我有一个为 C 指针练习编写的小程序。我只是获取一个 char 数组并使用指针反向打印它。有用。但是,我不明白为什么会这样。因为我在元素 9 开始 for 循环,它不应该在到达 "sdrow" 之前打印 5 个未定义的元素(根据我的经验,通常是随机的垃圾字符)吗?我觉得我应该更多地过滤输出。
int main(void)
{
char sentence[10] = "words";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%c", *(ptr+i));
}
puts("");
return 0;
}
输出:
sdrow
当您初始化数组并且初始化程序提供的元素少于数组中的元素时,剩余元素将被初始化为零:
int a[3] = { 1 }; // same as { 1, 0, 0 }
char s[4] = "ab"; // same as { 'a', 'b', 0, 0 }
换句话说,您的代码在打印五个字母之前打印了五个空字节。
(您可以通过将输出重定向到文件并查看文件大小轻松地看到这一点。)
当你初始化一个固定大小的数组时,c 会自动用零填充任何未指定的元素。 C 风格字符串将这些零视为空字符,这也是字符串终止字符。 所以第一组迭代打印一个空字符,然后他们开始打印实际字符。
数组的其余部分由编译器用零初始化,这就是为什么你什么都看不到的原因:
int main(void)
{
char sentence[10] = "words";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%02x", *(ptr+i));
}
puts("");
return 0;
}
但是你不应该依赖这个,因为行为是未定义的。如果您使用的是指针,您会看到一些不同的东西:
int main(void)
{
char *sentence = "words";
char *other ="more";
char *ptr = sentence;
for(int i=9;i>=0;i--)
{
printf("%c", *(ptr+i));
}
puts("");
return 0;
}