字符串初始化
时间:2020-03-05 18:49:19 来源:igfitidea点击:
之间有什么区别
char Str[32] = "char Str[32] = "";";
和
char a[] = "a3 2"; char b[] = "a"; printf("%i %i\n", sizeof(a), sizeof(b));
解决方案
回答
由于我们已经声明了大小,因此两个声明完全相等。但是,如果不指定大小,则可以看到第一个声明使字符串更大:
char str1[32] = "char str1[32] = {'"; char str2[32] = "";char str1[32] = {'##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##'}; char str2[32] = {'##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##', '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##'};','##代码##'}; char str2[32] = {'##代码##'};
印刷
##代码##这是因为a以两个空值(显式的一个和隐式的一个)结尾,而b仅以隐式的一个结尾。
回答
除非我没有记错,否则第一个将2个字符初始化为0(" \ 0"和始终存在的终止符,其余部分保持不变,最后一个将仅初始化1个字符(终止符)。
回答
正如其他人指出的那样,""表示一个终止的" \ 0"字符,因此" \ 0"实际上用两个空字符初始化了数组。
其他一些回答者暗示这是"相同的",但这并不完全正确。可能没有实际区别-只要使用数组的唯一方法是将其引用为以第一个字符开头的C字符串。但是请注意,它们确实会导致两种不同的内存初始化,特别是它们在Str [1]肯定为零还是未初始化(并且可以是任何东西,取决于编译器,OS和其他随机因素)方面有所不同。数组有一些用途(也许没有用,但仍然有用),它们的行为会有所不同。
回答
没有区别。它们都会在未声明的符号上生成编译器错误。 :P
回答
好吧,假设这两种情况如下(以避免编译器错误):
##代码##正如人们所说的那样,str1被初始化为两个空字符:
##代码##但是,根据C和C ++标准,如果初始化数组的一部分,则默认初始化数组的其余元素。对于字符数组,其余字符全部初始化为零(即空字符),因此,数组实际上被初始化为:
##代码##因此,最后,两者之间确实没有区别。