这五种声明cString的方式发生了什么?

Mat*_*ent 2 c c++ string char

另一个问题(我现在找不到的)的解释是"字符串"和{'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;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

声明并不完全等效:第一,第三和第四声明构成字符串文字的可写副本,而第二声明不制作副本.结果,做出这样的任务是合法的

cString1[0] = 'S'; // cString3 and cString4 would work as well
Run Code Online (Sandbox Code Playgroud)

同时试图做同样的cString2触发器未定义的行为.

第三和第四个声明是相同的,除了数字3允许编译器计算出数组的大小,而数字4则明确指定它.你可以像这样重写第一个声明

char cString1a[7]="string";
Run Code Online (Sandbox Code Playgroud)

遵循相同的模式.

虽然"string"可以{'s','t','r','i','n','g','\0'}在数组声明中重写,但在初始化指针的上下文中它是不合法的.这就是为什么最后一个声明不起作用的原因.

但是,在c99中,您可以使用复合文字重写它以使其工作(演示):

char * cString5 = (char[]){'s','t','r','i','n','g','\0'};
Run Code Online (Sandbox Code Playgroud)