为什么在 C 中这两个具有相同字符的数组的大小存在差异?

Why is there a difference between the size of these two arrays with the same characters in C?

我在下面创建了两个数组 'TEST' 和 'arr',都包含字符“ABCDE”。

#include <stdio.h>
#define TEST  "ABCDE" 
int main()
{
  char arr[5];
  int i;
  for(i=0;i<5;i++)
  {
       arr[i] = i + 65;
  }
  printf("%s\n",arr);
  printf("%zd %zd",sizeof arr,sizeof TEST);
  return 0;
}

输出为

ABCDE
5 6

既然这两个数组都包含 5 个字符,为什么它们的大小不同? (我知道每个字符串的末尾都有一个空字符。)

宏展开后,行

printf("%zd %zd",sizeof arr,sizeof TEST);

将是:

printf("%zd %zd",sizeof arr,sizeof "ABCDE" );

字符串文字将始终添加一个终止空字符。因此,字符串文字的类型是char[6]。因此,表达式 sizeof "ABCDE" 的计算结果为 6.

然而,arr的类型是char[5]。 Space 不会自动添加空终止字符。因此,表达式 sizeof arr 的计算结果为 5.

此外,值得注意的是以下行导致 undefined behavior:

printf("%s\n",arr);

%s printf 格式说明符需要一个以 null 结尾的字符串。但是,arr 不是空终止的。

如果要打印数组,则必须将打印的字符数限制为 5,如下所示:

printf( "%.5s\n", arr );

或者,如果您不想将长度硬编码到格式字符串中,您也可以这样做:

printf( "%.*s\n", (int)sizeof arr, arr );