为什么 char* p = "..." 正确,而 int* p = {1,2} 是错误的?
Why is char* p = "..." right but int* p = {1,2} wrong?
const char *cval = "nothing"; // This is right.
int *ival = {1, 2, 3, 4}; // This is wrong.
为什么第一个是正确的而第二个是错误的?
这是因为语言规范是这样说的(每种语言都是独立的)。
在C和c++中,字符串字面值都是一个未命名的对象,一个左值。因为它是一个对象,所以可以用指针指向它。同时,{1, 2, 3, 4}
只是一个不表示对象的句法结构。它只是一个形成聚合初始化语法的正式字符序列。
int *ival = (int []) {1, 2, 3, 4};
这基本上是第一个声明的"int数组"对应。所以,从C的角度来看,你的第二个声明是"错误的",仅仅是因为你使用了不正确的语法。
char *cval = "nothing"; // This is right.
字符串字量有特殊的处理-编译器知道将文本"nothing "放在某些(不可变的)内存中的某个地方,类型为char[]
,然后数组衰减到可以复制到cval
的char*
(对于c++ 03和更早的版本,在c++ 11中您应该使用const char*
)。
int *ival = {1, 2, 3, 4}; // This is wrong.
…当编译器不需要在只读内存中存储{1,2,3,4}时,它只需要:
用于数组赋值-将值复制到本地声明对象中的连续数组位置(但是当
ival
是int*
时,没有为要放入的值分配内存)对于构造函数接受
initializer_list
s的类,创建一个并调用该构造函数。
相关文章:
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 未声明的标识符错误,但变量定义正确 (?)
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 即使我的代码没有错误,我也没有得到正确的输出
- 宏定义不正确没有错误
- 为什么 MSVC 在使用正确的签名覆盖函数时会产生 C3668 错误?
- C++ CURL 库链接器错误,但包含正确的库
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 如何避免 boost 的野兽body_limit错误并正确处理大消息
- rpmbuild check-rpath 报告错误,指出路径不是绝对的,不正确的
- 对从引用到 std::reference_wrapper 或编译器错误的隐式转换的理解不正确?
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 打开CV异常错误,尽管我的代码是正确的
- 简单的字符串替换给出错误,尽管参数正确
- 编译器错误:正确安装 odeint