C ++字符串文字类型和声明

时间:2016-08-23 18:11:02

标签: c++ string

两种类型的声明:

char* str1 = "string 1";

char str2[] = "string 2";

我的编译器不允许我使用带错误的第一个声明 从const char [8]到char *的错误转换。看起来还不错, 像这样的版本:

const char* str1 = "string 1";

由编译器传递。

请澄清我的理解。 我相信,如果我们宣布两个版本,例如在main()中, 第一个(const char *) - 唯一的指针将在堆栈上分配,并在数据段中用一些地址初始化。 第二个版本(char []) - 整个符号数组将放在堆栈上

据我所知,字符串文字现在总是有一个const char []类型。 是使用const char * depricated?仅用于C兼容性?

每个版本将存储字符串?

2 个答案:

答案 0 :(得分:2)

char* str1 = "string 1";

从C ++ 98开始不推荐使用,从C ++ 11开始就是格式不正确,因为无法修改字符串文字。修改它会导致未定义的行为。

为避免这种情况,标准禁止将其分配给可修改的char指针,因为可能稍后会被修改,而程序员不会意识到他/她不应该修改它

char str2[] = "string 2";

是的,这会分配一个字符数组,而每个字符都存储在堆栈中。

const char* str1 = "string 1";

不推荐使用此选项,建议将字符串文字指定给char指针(仅限方法)。在这里,str1指向const个字符,即它们无法修改。因此,在某处使用它是安全的,因为编译器将强制永远不会修改char

这里,str1存储在堆栈上,指向一个字符串文字,它可能存储也可能不存储在只读存储器中(这是实现定义的)。

答案 1 :(得分:2)

char str2[] = "string 2";

"string 2"是存储在只读内存中的字符串文字const char[9]

char str2[]将在读写内存中分配char数组(大小从初始化程序大小中扣除)。

=将使用字符串文字来初始化char数组(执行memcpy内容的"string 2"。)

我的意思是原则上。使用优化生成的实际机器代码可能会有所不同,从字符串文字中设置str2内容的方式比memcpy更简单。

char* str1 = "string 1"; - 在这里你试图得到实际的字符串文字内存地址,但那个地址是const,所以你不应该将它分配/转换为char *

const char* str1应该正常工作,从const char[]const char *的转换是有效的(它们几乎是一样的,除非您在编译期间可以访问原始数组大小,然后指针变量是无大小的哑巴版。)