-3

我在下面创建了两个数组“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 个字符,为什么它们的大小不同?(我知道每个字符串的末尾都有一个空字符。)

4

1 回答 1

1

宏展开后,线

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

将会:

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

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

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

此外,值得注意的是以下行导致未定义的行为

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

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

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

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

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

printf( "%.*s\n", (int)sizeof arr, arr );
于 2021-12-29T02:12:32.813 回答