我已经为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
答案 0 :(得分:2)
初始化数组并且初始化程序提供的元素少于数组中的元素时,其余元素初始化为零:
int a[3] = { 1 }; // same as { 1, 0, 0 }
char s[4] = "ab"; // same as { 'a', 'b', 0, 0 }
换句话说,您的代码在打印五个字母之前打印五个空字节。
(您可以通过将输出重定向到文件并查看文件大小来轻松查看。)
答案 1 :(得分:1)
初始化固定大小的数组时,c将自动用零填充任何未指定的元素。 C风格的字符串将这些零视为空字符,也是字符串终止字符。 因此,第一批迭代打印出一个空字符,然后它们开始打印实际字符。
答案 2 :(得分:0)
数组的其余部分由编译器用零初始化,这就是你什么都看不见的原因:
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;
}