C/C++ 中的指针到字符数组赋值
pointer-to-char-array assignments in c/c++
过去我一直在使用Visual Studio 2010/2013/2015,这种语法是可能的:
char* szString = "This works!";
我决定踏上并改变我对Linux编码的生活方式,因为我已经安装了g++并将SlickEdit作为我的IDE。
这句话好像不行了。谁能说明为什么?
但是,这有效:
char strString[] = "This works!";
该错误与 c++11 有关。
有谁知道为什么会这样?不是如何修复它,因为在我的工作区中没有任何方法可以安装 c++11 编译器,我只是好奇它是否与编译器工作方式的背景有关。我对第一行代码的了解是,它在堆栈上创建了一个常量变量,并创建了一个新的指针,将自身设置为该 ESP 的值,但在第二行上,它计算常量变量上的字母数量,然后最终设置一个空终止符作为结果。
哦,还有一件事 -> 在 GCC/GPP 中设置第一个的方式似乎也有所不同,因为第一个类型是 {char*&},第二个是 {char(*)[12]},对此有什么解释吗?谢谢!
当你编写文字"text"
时,该文本将包含在编译的程序映像的某个位置。 出于安全原因,程序映像通常放置在现代操作系统上的写保护内存中。
char* someString = "text";
声明指向可能受写保护的程序映像中的字符串的指针。 将此指针声明为非常量的功能是C++11之前包含的一项功能,以保持与C的源代码兼容性。 请注意,即使someString
不是指向常量的指针,任何修改它指向的值的尝试仍会导致未定义的行为。 此向后兼容性功能已在 C++11 中删除。 someString
现在必须声明为指向常量的指针:const char* someString = "text";
。 您可以强制丢弃const
,但尝试写入指向的值仍会导致未定义的行为,与强制转换为非常量的任何const
值相同。
char someString[] = "text";
的工作方式不同。 这会将字符串"text"
从程序的代码存储器复制到位于数据存储器中的数组中。 它类似于
char someString[5];
strcpy(someString, "text");
由于someString
是程序数据存储器中的一个数组,因此可以写入它,并且不需要进行常量限定。
根据标准:附录C(兼容性)
C1.1 第2.14.5款:
更改:字符串文本成为常量
字符串文本的类型从"字符数组"更改为"常量字符数组"。char16_t字符串文本的类型从"某个整数类型的数组"更改为"常量char16_t数组"。char32_t字符串文本的类型从"某个整数类型的数组"更改为"常量char32_t数组"。
宽字符串文本的类型从"wchar_t数组"更改为"常量wchar_t数组"。
理由:这样可以避免调用不适当的重载函数,该函数可能希望能够修改其参数。
事实上,C++标准 2.14.5.8 说:
普通字符串文本和 UTF-8 字符串文本也称为窄字符串文本。窄字符串文本的类型为"n const char 数组",其中 n 是下面定义的字符串大小,并具有静态存储持续时间
这也允许此类字符串得到各种特殊处理:编译器/链接器可以选择消除跨编译单元的字符串重复项(msvc 术语中的字符串池),它可以将它们存储在数据部分和只读内存中。
2.14.5.12
是否所有字符串文本都是不同的(即,存储在非重叠对象中)是实现定义的。尝试修改字符串文本的效果是不确定的。
char* x = "hello world";
是对早期C C++继承的回归,Visual Studio支持它,因为他们自己的库中有沉重的包袱。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?