我对以下代码片段感到困惑,因为对于相同的字符串,输出分别为1和2。
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
void main()
{
char str2[1]="a",str3[]="a";
printf("%d %d ",sizeof(str2),sizeof(str3));
getch();
}
答案 0 :(得分:6)
char str2[1]="a"
为您提供内容为{'a'}
的单元素数组。此数组缺少用于表示C字符串结尾的nul终止符,因此您将无法将str2
用作字符串。
str3[]="a"
为您提供一个char数组,其中包含一个nul-terminator的空间 - {'a', '\0'}
答案 1 :(得分:2)
在第一种情况(str2
)中,您将数组的大小设置为1
;即使初始化程序提供了两个字符,第二个char
也会被截断以匹配您指定的数组的大小。
在第二种情况下,让编译器选择确切的大小,在这种情况下等于字符串文字的大小。
"a"
的大小为2,因为对于null终止符需要额外的char
。
注意:in order to print size_t
in a portable way您需要将d
,u
或x
添加到z
前面,如下所示:
printf("%zd %zd ",sizeof(str2),sizeof(str3));
答案 2 :(得分:0)
C中的字符串文字具有字符数组类型,这些字符数组包含字符串文字中明确指定的字符数和终止零字符。
例如,字符串文字"a"
由两个字符'a'
和'\0'
组成,其类型为char [2]
。
在数组str2
char str2[1]="a";
您明确指定其大小等于1.因此sizeof( str2 )
将等于1 number_of_characters * sizeof( char )
考虑到str2
的这种定义被认为是C ++中的无效定义,因为初始化器比初始化对象(char类型的元素)更多,因为正如我在上面指出的那样,字符串文字包含终止零。
在此数组定义中
char str3[]="a";
未指定数组的大小,因此根据使用的初始化程序数计算。由于字符串文字包含两个字符('a'
和'\0
'),因此str3
将使用这些字符进行初始化,并包含两个元素。那是str3
将是字符串文字的精确副本。因此sizeof( str3 )
将等于2.