字符串初始化

有什么区别

char Str[32] = "\0"; 

 char Str[32] = ""; 

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

 char a[] = "a\0"; char b[] = "a"; printf("%i %i\n", sizeof(a), sizeof(b)); 

版画

 3 2 

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

好吧,假设两种情况如下(避免编译错误):

 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’字符,所以“\ 0”实际上用两个空字符初始化数组。

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

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

嗯用指针初始化怎么样?

 char *myString = "Here is a string"; 

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

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

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

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