两种类型的声明:
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兼容性?
每个版本将存储字符串?
答案 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 *
的转换是有效的(它们几乎是一样的,除非您在编译期间可以访问原始数组大小,然后指针变量是无大小的哑巴版。)