字符串初始化
回答
之间的差别,因为你已经宣布的尺寸,两个声明是完全平等的。但是,如果不指定大小,你可以看到,第一个声明中作出较大的字符串:
char a[] = "a\0";
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));
打印
3 2
这是因为有两个空值的结束(显式之一,隐含的),而b仅以隐式结束。
除非我弄错了,否则第一个会将2个字符初始化为0('\ 0'和始终存在的终止符,其余不变,最后只会初始化1个字符(终止符)。
正如其他人所指出的那样,“”意味着一个终止“\ 0”字符,所以“\ 0”实际上初始化两个空字符数组。
一些其他的应答者已经暗示,这是“同“,但这并不完全正确,可能没有实际区别 - 只要使用数组的唯一方法就是将其引用为以第一个字符开头的C字符串,但请注意,它们确实导致了两个不同的记忆initalizati特别是它们在Str [1]绝对为零还是未初始化(根据编译器,操作系统和其他随机因素可能是任何东西)方面有所不同。这个数组有一些用法(可能不是有用的,但仍然)会有不同的行为。
在问题的上下文中,指定数组的大小时,结果是相同的 - 字母“a”后面跟着31个空字节“0”。只有在未定义数组的情况下才会有区别。 – 2014-10-09 04:02:31
没有区别。它们都会在未声明的符号上产生编译器错误。 :P
假设你指的是代码为Str [32] =“\ 0”;`和Str [32] =“”的问题的原始版本,并断言这些应该会产生编译器错误。当然,这取决于上下文。如果被视为“定义”(因为它们在问题的修订版本中),那么类型(`char`)就会丢失。如果你假设`char * Str [33];`作为先前的定义,那么两者都是有意义的(但指向的字符串是不同的),但与其他答案假设不同。这个答案没有帮助,因为它没有解释为什么。 – 2014-10-09 15:09:24
那么,假设两种情况如下(以避免编译器错误):
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'};
因此,在端部,确实在两者之间没有差别。
重要观察! – jfm3 2008-09-16 21:36:46
嗯那么用指针初始化呢?
char *myString = "Here is a string";
虽然传统的原因,我更喜欢用:
unsigned char *myString = "Here is a string";
在这种情况下,空终止是由编译器嵌入。 您可以将指针指向另一个字符串,并且您指定任意长度的字符串都是独立的 。
- 1. 字符串初始化
- 2. Android字符串初始化
- 3. 初始化“的字符串”
- 4. 初始化字符*
- 5. 出错初始化字符串流
- 6. 字符串不断初始化为空
- 7. 初始化ObjectC中的空字符串?
- 8. C++ 11字符串初始化
- 9. 用argv初始化C++字符串
- 10. 字符串初始化失败
- 11. 的C#初始化字符串数组
- 12. 从字符串初始化单元
- 13. 初始化字符串使用指针
- 14. 使用nsmutabledata初始化字符串
- 15. 字符串初始化和性能
- 16. 初始化多朦字符串数组
- 17. 初始化字符串用双引号
- 18. 为什么字符串需要用初始值初始化?
- 19. 字符串数组的初始化字符串太长
- 20. 初始化字符串为空与空字符串
- 21. 使用空字符串初始化所有字符串成员
- 22. 未初始化的字符
- 23. 字符指针初始化
- 24. 在.NET中初始化字符串和不初始化字符串之间的区别
- 25. 注意:初始化的字符串偏移:未初始化字符串偏移量:1
- 26. 使用初始化字符串初始化匹配器,获取NullPointerException
- 27. 初始化字符和字符指针
- 28. Objective-C:用字符串索引初始化字符char
- 29. 字符数组的初始化字符串太长。在Xcode
- 30. 将字符串写入初始化空白字符数组
数组的尾部字节也将为零字节。 – 2014-10-09 04:02:50