C/C++ 中的指针到字符数组赋值

pointer-to-char-array assignments in c/c++

本文关键字:字符 数组 赋值 指针 C++      更新时间:2023-10-16

过去我一直在使用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支持它,因为他们自己的库中有沉重的包袱。