为什么const char * pt2 = {'1','2','3','\ 0'};无法编译?

时间:2013-05-29 07:34:11

标签: c++ string

const char *pt1="123";
const char *pt2={'1', '2', '3', '\0'};

它是一样的吗?后者无法编译。

  

错误:标量对象'pt2'在初始值设定项中需要一个元素

为什么呢? "123"{'1', '2', '3', '\0'}不相同吗?

我可以使用delete[] pt1来发布资源,还是只使用delete pt1

4 个答案:

答案 0 :(得分:9)

不,他们不一样。第一个是字符串文字,第二个是初始化列表,其元素类型为char

您可以使用第二种语法:

const char pt2[]={'1', '2', '3', '\0'};

但即便在这种情况下,他们不一样

const char *pt1="123";

在这种情况下,"123"将存储在只读存储器中。 pt1只是指向它。

const char pt2[]={'1', '2', '3', '\0'};

但在此,所有元素都将被复制到pt2。

  

可以使用delete [] pt1释放资源或只删除pt?

不,你不能

(有可能,但你不应该这样做

答案 1 :(得分:4)

在C ++中无法做到这一点。不,您尝试使用聚合初始值设定项与字符串文字不同。像{'1', '2', '3', '\0'}这样的Agggregate初始化器不会引入数组。

作为旁注,在C语言中,为了通过非字符串文字实现数组对象,您必须使用名为复合文字的C99功能,使用以下语法

const char *pt2 = (const char []) {'1', '2', '3', '\0'};

这与使用字符串文字得到的几乎相同。但是有一个区别:字符串文字始终具有静态存储持续时间,而本地使用的复合文字将具有自动存储持续时间。

答案 2 :(得分:2)

它失败是因为你声明了一个指针,而不是一个数组。指针是标量类型,因此无法为其分配具有多个元素的初始化列表。

你可能会对此感到困惑:

const char pt2[] = {'1', '2', '3', '\0'};

哪个不一样。

答案 3 :(得分:1)

const char *pt2={'1', '2', '3', '\0'};

该语言不允许使用初始化列表初始化指针,指针需要存储在其中的内存地址。初始化列表不返回任何内存地址。

const char *pt1="123"; 

这是一个字符串文字,它已在要在只读数据段上分配的语言中定义,并由\0自动终止。 ptr是指向char的指针,可以指向char或单char的数组。因为,""定义的文字被确认以\0结尾,{{1}}作为字符串结尾的指示符,你可以这样做。