字符串初始化
回答
之间的差别,因为你已经宣布的尺寸,两个声明是完全平等的。但是,如果不指定大小,你可以看到,第一个声明中作出较大的字符串:
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. Android字符串初始化
- 2. 初始化“的字符串”
- 3. 字符串初始化
- 4. GPS初始化字符串?
- 5. 与初始化字符串字面
- 6. 初始化字符*
- 7. 从字符串初始化单元
- 8. 初始化字符串使用指针
- 9. C中的字符串初始化
- 10. 字符串初始化和性能
- 11. LLVM IR字符串初始化
- 12. 初始化字符串用双引号
- 13. 字符串不断初始化为空
- 14. 字符串的声明和初始化
- 15. 连接字符串未初始化
- 16. 字符串列表初始化
- 17. 字符串变量初始化错误
- 18. NullPointerException(初始化字符串时)
- 19. C++的初始化字符串指针
- 20. 初始化多朦字符串数组
- 21. 用argv初始化C++字符串
- 22. 字符串初始化失败
- 23. 初始化ObjectC中的空字符串?
- 24. C++ 11字符串初始化
- 25. 使用初始化字符串数组
- 26. 的C#初始化字符串数组
- 27. 使用nsmutabledata初始化字符串
- 28. 字符串数组初始化
- 29. 使用字符串初始化
- 30. 出错初始化字符串流
数组的尾部字节也将为零字节。 – 2014-10-09 04:02:50