为什么在 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 );
我在下面创建了两个数组 '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 );