字符串初始化

时间:2020-03-05 18:49:19  来源:igfitidea点击:

之间有什么区别

char Str[32] = "
char Str[32] = "";
";

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

解决方案

回答

由于我们已经声明了大小,因此两个声明完全相等。但是,如果不指定大小,则可以看到第一个声明使字符串更大:

char str1[32] = "
char str1[32] = {'
char str1[32] = {'##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##'};
char str2[32] = {'##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##',
                 '##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##','##代码##'};
','##代码##'}; char str2[32] = {'##代码##'};
"; char str2[32] = "";

印刷

##代码##

这是因为a以两个空值(显式的一个和隐式的一个)结尾,而b仅以隐式的一个结尾。

回答

除非我没有记错,否则第一个将2个字符初始化为0(" \ 0"和始终存在的终止符,其余部分保持不变,最后一个将仅初始化1个字符(终止符)。

回答

正如其他人指出的那样,""表示一个终止的" \ 0"字符,因此" \ 0"实际上用两个空字符初始化了数组。

其他一些回答者暗示这是"相同的",但这并不完全正确。可能没有实际区别-只要使用数组的唯一方法是将其引用为以第一个字符开头的C字符串。但是请注意,它们确实会导致两种不同的内存初始化,特别是它们在Str [1]肯定为零还是未初始化(并且可以是任何东西,取决于编译器,OS和其他随机因素)方面有所不同。数组有一些用途(也许没有用,但仍然有用),它们的行为会有所不同。

回答

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

回答

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

##代码##

正如人们所说的那样,str1被初始化为两个空字符:

##代码##

但是,根据C和C ++标准,如果初始化数组的一部分,则默认初始化数组的其余元素。对于字符数组,其余字符全部初始化为零(即空字符),因此,数组实际上被初始化为:

##代码##

因此,最后,两者之间确实没有区别。