之间有什么区别
char Str[32] = "\0";
和
char Str[32] = "";
答案 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