另一个问题(我现在找不到)的解释是 "string"and {'s','t','r','i','n','g','\0' } 是等价的。事实上,下面的前四个声明都编译并且似乎做同样的事情。但是为什么第五个声明不能编译呢?看起来它们毕竟不是等价的。所以我的问题是,四个正确的和一个不正确的 cstring 声明到底是怎么回事?
int main()
{
char cString1[]="string";
char * cString2 = "string";
char cString3[] = {'s','t','r','i','n','g', '\0'};
char cString4[7] = {'s','t','r','i','n','g','\0'};
char * cString5 = {'s','t','r','i','n','g','\0'};
return 0;
}
最佳答案
声明并不完全相同:第一个、第三个和第四个声明创建字符串文字的可写拷贝,而第二个声明不创建拷贝。结果,这样的赋值是合法的
cString1[0] = 'S'; // cString3 and cString4 would work as well
尝试对 cString2
执行相同操作会触发未定义的行为。
第三和第四个声明是相同的,除了第三个让编译器计算出数组的大小,而第四个明确指定它。你可以像这样重写第一个声明
char cString1a[7]="string";
遵循相同的模式。
虽然"string"
可以重写为{'s','t','r','i','n','g','\0' }
在数组声明中,在初始化指针的上下文中是不合法的。这就是最后一个声明不起作用的原因。
但是,在 c99 中,您可以使用复合文字 重写它以使其工作 (demo):
char * cString5 = (char[]){'s','t','r','i','n','g','\0'};
关于c++ - 这五种不同的 cString 声明方式是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615859/