2008-09-08 116 views

回答

22

之间的差别,因为你已经宣布的尺寸,两个声明是完全平等的。但是,如果不指定大小,你可以看到,第一个声明中作出较大的字符串:

char a[] = "a\0"; 
char b[] = "a"; 

printf("%i %i\n", sizeof(a), sizeof(b)); 

打印

3 2 

这是因为有两个空值的结束(显式之一,隐含的),而b仅以隐式结束。

1

除非我弄错了,否则第一个会将2个字符初始化为0('\ 0'和始终存在的终止符,其余不变,最后只会初始化1个字符(终止符)。

+0

数组的尾部字节也将为零字节。 – 2014-10-09 04:02:50

3

正如其他人所指出的那样,“”意味着一个终止“\ 0”字符,所以“\ 0”实际上初始化两个空字符数组。

一些其他的应答者已经暗示,这是“同“,但这并不完全正确,可能没有实际区别 - 只要使用数组的唯一方法就是将其引用为以第一个字符开头的C字符串,但请注意,它们确实导致了两个不同的记忆initalizati特别是它们在Str [1]绝对为零还是未初始化(根据编译器,操作系统和其他随机因素可能是任何东西)方面有所不同。这个数组有一些用法(可能不是有用的,但仍然)会有不同的行为。

+0

在问题的上下文中,指定数组的大小时,结果是相同的 - 字母“a”后面跟着31个空字节“0”。只有在未定义数组的情况下才会有区别。 – 2014-10-09 04:02:31

-4

没有区别。它们都会在未声明的符号上产生编译器错误。 :P

+0

假设你指的是代码为Str [32] =“\ 0”;`和Str [32] =“”的问题的原始版本,并断言这些应该会产生编译器错误。当然,这取决于上下文。如果被视为“定义”(因为它们在问题的修订版本中),那么类型(`char`)就会丢失。如果你假设`char * Str [33];`作为先前的定义,那么两者都是有意义的(但指向的字符串是不同的),但与其他答案假设不同。这个答案没有帮助,因为它没有解释为什么。 – 2014-10-09 15:09:24

16

那么,假设两种情况如下(以避免编译器错误):

char str1[32] = "\0"; 
char str2[32] = ""; 

正如人们所说的,str1和两个空字符初始化:

char str1[32] = {'\0','\0'}; 
char str2[32] = {'\0'}; 

然而根据C和C++标准,如果数组的一部分被初始化,则数组的其余元素将被默认初始化。对于一个字符阵列,剩余字符是初始化所有零(即空字符),所以阵列是真的初始化为:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0', 
       '\0','\0','\0','\0','\0','\0','\0','\0'}; 

因此,在端部,确实在两者之间没有差别。

+0

重要观察! – jfm3 2008-09-16 21:36:46

1

嗯那么用指针初始化呢?

char *myString = "Here is a string"; 

虽然传统的原因,我更喜欢用:

unsigned char *myString = "Here is a string"; 

在这种情况下,空终止是由编译器嵌入。 您可以将指针指向另一个字符串,并且您指定任意长度的字符串都是独立的 。