字符串初始化

时间:2008-09-08 12:45:17

标签: c

之间有什么区别
char Str[32] = "\0";

char Str[32] = "";

6 个答案:

答案 0 :(得分:22)

由于您已经声明了尺寸,因此两个声明完全相同。但是,如果未指定大小,则可以看到第一个声明生成更大的字符串:

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

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

打印

3 2

这是因为一个结尾有两个空值(显式的和隐式的),而b只有隐式结束。

答案 1 :(得分: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'};

所以,最后,两者之间确实没有区别。

答案 2 :(得分:3)

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

其他一些回答者暗示这是“相同的”,但这并不完全正确。可能没有实际区别 - 只要使用数组的唯一方法是将其引用为以第一个字符开头的C字符串。但请注意,它们确实会导致两种不同的内存初始化,特别是它们的不同之处在于Str [1]是绝对零还是未初始化(并且可能是任何内容,具体取决于编译器,操作系统和其他随机因素)。这些数组有一些用途(可能没用,但仍然有)会产生不同的行为。

答案 3 :(得分:1)

除非我弄错了,否则第一个会将2个字符初始化为0('\ 0'和终结符始终存在,其余部分保持不变,最后一个只初始化1个字符(终结符)。 / p>

答案 4 :(得分:1)

嗯用指针初始化怎么办?

' Keyboard Shortcut: Ctrl+Shift+C
'
    ActiveCell.Copy
    ActiveCell.Offset(0, 5).Copy
End Sub

虽然出于传统原因我更喜欢使用:

char *myString = "Here is a string";

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

答案 5 :(得分:-4)

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