为什么 char* p = "..." 正确,而 int* p = {1,2} 是错误的?

Why is char* p = "..." right but int* p = {1,2} wrong?

本文关键字:错误 正确 char 为什么 int      更新时间:2023-10-16
const char *cval = "nothing";  // This is right.
int *ival = {1, 2, 3, 4};  // This is wrong.

为什么第一个是正确的而第二个是错误的?

这是因为语言规范是这样说的(每种语言都是独立的)。

在C和c++中,字符串字面值都是一个未命名的对象,一个左值。因为它是一个对象,所以可以用指针指向它。同时,{1, 2, 3, 4}只是一个不表示对象的句法结构。它只是一个形成聚合初始化语法的正式字符序列。

同时,在C语言中(从C99开始)有一个叫做复合字面值的特性,它允许形成聚合类型的无名对象。例如,以下初始化是有效的
int *ival = (int []) {1, 2, 3, 4};

这基本上是第一个声明的"int数组"对应。所以,从C的角度来看,你的第二个声明是"错误的",仅仅是因为你使用了不正确的语法。

char *cval = "nothing";  // This is right.

字符串字量有特殊的处理-编译器知道将文本"nothing"放在某些(不可变的)内存中的某个地方,类型为char[],然后数组衰减到可以复制到cvalchar*(对于c++ 03和更早的版本,在c++ 11中您应该使用const char*)。

int *ival = {1, 2, 3, 4};  // This is wrong.

…当编译器不需要在只读内存中存储{1,2,3,4}时,它只需要:

  • 用于数组赋值-将值复制到本地声明对象中的连续数组位置(但是当ivalint*时,没有为要放入的值分配内存)

  • 对于构造函数接受initializer_list s的类,创建一个并调用该构造函数。