C - 打印未定义的数组元素并不能给我带来垃圾

时间:2016-09-25 21:16:21

标签: c arrays pointers buffer recycle-bin

我已经为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

3 个答案:

答案 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;
}