【发布时间】:2016-09-28 09:31:37
【问题描述】:
如果此代码正确:
char v1[ ] = "AB";
char v2[ ] = {"AB"};
char v3[ ] = {'A', 'B'};
char v4[2] = "AB";
char v5[2] = {"AB"};
char v6[2] = {'A', 'B'};
char *str1 = "AB";
char *str2 = {"AB"};
那为什么另一个不是呢?
char *str3 = {'A', 'B'};
据我所知(如果我在任何时候错了,请纠正我)“AB”是字符串文字,“A”和“B”是字符(整数、标量)。在 char *str1 = "AB";定义了字符串文字“AB”,并将 char 指针设置为指向该字符串文字(指向第一个元素)。用 char *str3 = {'A', 'B'};定义了两个字符并将其存储在随后的内存位置中,并且 char 指针“应该”设置为指向第一个字符。为什么不正确?
以类似的方式,像 v3[] 或 v6[2] 这样的常规字符数组确实可以使用 {'A', 'B'} 进行初始化。这两个字符被定义,数组被设置为指向它们,因此,被“变成”或被视为字符串文字。为什么像 char *str3 这样的 char 指针的行为方式不同?
仅作记录,我得到的 gcc 编译器警告是当它到达“A”时“初始化从整数生成指针而不进行强制转换”,当它到达“B”时“标量初始化器中的多余元素”。
提前致谢。
【问题讨论】:
-
指针不是数组,数组不是指针。可以在类似的上下文中使用,但它们并不相同。它们不同的一种方式是它们的初始化方式。
-
"AB"是您指出的字符串文字,但{ 'A', 'B' }不是,也不是任何类型的数组。它是用于初始化变量的数据,因此 a) 类型错误,并且 b) 提供了多个初始化器。 -
这个
char *str3 = (char[]) {'A', 'B'};可以工作... :-) -
感谢所有人 (@alk @WeatherVane @JoachimPileborg) :) 这是有道理的:1)“AB”是编译器已经分配的未命名字符串,然后可以通过数组或一个 char 指针(无需分配新内存)。 2) {'A', 'B'} 只是初始化器。因此,最终表现不符合概念预期的是数组,因为它们可以同时被初始化:1)分配内存并初始化它们(
char v3[ ] = {'A', 'B'};)2)不分配内存,而只是让它们指向一个已经分配的未命名的字符串 (char v1[ ] = "AB";)。 -
这两行:
char v4[2] = "AB"; char v5[2] = {"AB"};不正确。因为字符串总是以 NUL 字节结束。但是,这两个变量声明只允许 2 个字节,而实际字符串长度是 3,而不是 2
标签: c string pointers initialization braces