【发布时间】:2010-09-08 03:42:27
【问题描述】:
有什么区别
char str1[32] = "\0";
和
char str2[32] = "";
【问题讨论】:
标签: c
有什么区别
char str1[32] = "\0";
和
char str2[32] = "";
【问题讨论】:
标签: c
好吧,假设两种情况如下(避免编译器错误):
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'};
所以说到底,两者真的没有区别。
【讨论】:
char a[2]="be" 不明智。
malloc() 分配的内存未初始化为任何确定的值。第一次分配内存时它可能是零,但如果它被修改、释放然后第二次分配,新分配的空间(通常)将(通常)具有释放时发生的任何值,除非malloc()使用其内部簿记等的一些空间。
正如其他人所指出的,"" 意味着一个终止 '\0' 字符,因此 "\0" 实际上用两个空字符初始化数组。
其他一些回答者暗示这是“相同的”,但这并不完全正确。可能没有实际区别——只要使用数组的唯一方法是将其作为从第一个字符开始的 C 字符串引用。但请注意,它们确实会导致两种不同的内存初始化,特别是它们在 Str[1] 是否绝对为零或未初始化(可能是任何东西,取决于编译器、操作系统和其他随机因素)方面有所不同。数组有一些用途(可能没用,但仍然有用)会有不同的行为。
【讨论】:
'a' 后跟 31 个空字节 '\0'。只有在未调整大小的数组的上下文中才有区别。
除非我弄错了,否则第一个会将 2 个字符初始化为 0('\0' 和始终存在的终止符,其余部分保持不变,最后一个将仅初始化 1 个字符(终止符)。
【讨论】:
由于您已经声明了大小,因此两个声明完全相等。但是,如果您不指定大小,您可以看到第一个声明产生了一个更大的字符串:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
打印
3 2
这是因为 a 以两个空值结尾(显式空值和隐式空值),而 b 仅以隐式空值结尾。
【讨论】: