【问题标题】:Why is there a difference between the size of these two arrays with the same characters in C?为什么这两个在 C 中具有相同字符的数组的大小存在差异?
【发布时间】:2021-12-29 01:49:00
【问题描述】:

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

【问题讨论】:

  • "知道每个字符串的末尾都有一个空字符。":我不确定您认为空字符在arr 中的位置。你能解释一下你认为两个sizeof 表达式应该有相同结果的原因吗?
  • 我认为'arr'的大小应该是6,但是'arr'似乎没有地方存储空字符?
  • 如果你告诉编译器arr 有五个槽,那就是它。如果您随后在所有五个狭缝中放置非零字符,则您不能将数组用作字符串。这对编译器来说不是问题。数组不一定可以用作字符串。

标签: arrays c character null-character


【解决方案1】:

宏展开后的行

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

将是:

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

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

但是,arr 的类型是 char[5]。不会自动添加空终止字符的空格。因此,表达式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 );

【讨论】:

  • 谢谢,我知道我的错了。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多