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