c / c ++中指向char数组的指针

时间:2016-07-10 16:54:52

标签: c++ char-pointer

过去我一直在使用Visual Studio 2010/2013/2015,这种语法是可能的:

gulp test

我决定继续改变我对Linux的编码生活方式,因为我安装了g ++并将SlickEdit作为我的IDE。

似乎这句话不再适用了。 任何人都可以说明原因吗?

但这有效:

char* szString = "This works!";

错误与c ++ 11有关。

有谁知道为什么会这样?不是如何修复它,导致在我的工作区中没有任何方法来安装c ++ 11编译器,我只是好奇它是否与后台有关编译器工作方式的内容有关。 我对第一行代码的了解是,它在堆栈上创建一个常量变量,并创建一个新的指针设置自己朝着ESP的值,但在第二行,它计算常量变量上的字母数量,然后最后设置一个null终止符。

哦还有一件事 - >在GCC / GPP中设置第一个的方式似乎也有所不同,因为第一个类型是{char *&},第二个类型是{char(*)[12]},对此有任何解释太?谢谢!

2 个答案:

答案 0 :(得分:6)

当您编写文字"text"时,该文本将包含在已编译的程序图像的某处。出于安全原因,程序映像通常放在现代操作系统的写保护内存中。

char* someString = "text";声明指向可能写保护的程序映像中的字符串的指针。将此指针声明为非const的能力是包含在C ++ 11中以保持与C的源兼容性的功能。请注意,即使someString不是指向const的指针,也不会尝试修改该值它指向的仍然会导致未定义的行为。在C ++ 11中删除了此向后兼容性功能。现在必须将someString声明为指向const的指针:const char* someString = "text";。你可以抛弃const,但是试图写入指向的值仍然会导致未定义的行为与你转换为非const的任何const值相同。

char someString[] = "text";的工作方式不同。这会将程序代码存储器中的字符串"text"复制到位于数据存储器中的数组中。它类似于

char someString[5];
strcpy(someString, "text");

由于someString是程序数据存储器中的一个数组,所以可以写入它,并且它不需要是const限定的。

答案 1 :(得分:2)

根据标准:附件C(Compatability)

C1.1子条款2.14.5:

  

更改:字符串文字使const

     

字符串文字的类型从“char of char”更改为“const char数组。”char16_t字符串文字的类型从“some-integer-type”数组更改为“const char16_t数组” “char32_t字符串文字的类型从”some-integer-type数组“更改为”const char32_t数组。“

     

宽字符串文字的类型从“wchar_t数组”更改为“const 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支持它,因为他们自己的库中存在沉重的包袱。