输出之间的差异

时间:2014-08-04 16:19:58

标签: c

我对以下代码片段感到困惑,因为对于相同的字符串,输出分别为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();
}

3 个答案:

答案 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您需要将dux添加到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.