字符串初始化
有什么区别
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