2016-08-23 34 views
0

两类声明:C++字符串字面型和申报

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兼容?

其中每个版本将存储字符串?

+3

C和C++是不同的语言!任何你期望他们表现完全一样的理由?这不是关于C. – Olaf

+3

这很有趣,''string 1''是一个'const char [9]',而不是'const char [8]'。 – aschepler

+1

@aschepler不好笑 - 正常。有一个结尾的0字符组成了9 ... – Aconcagua

回答

2
char* str1 = "string 1"; 

这被弃用的C++ 98,并且不良形成为C++ 11,作为文字串不能被修改。修改它会导致未定义的行为。

为了避免这种情况,该标准禁止将其分配给修改char指针,因为它可能以后无需程序员意识到他/她不应该修改它修改。

char str2[] = "string 2"; 

是的,这分配字符的阵列,而每个字符被存储在栈上。

const char* str1 = "string 1"; 

这不会被弃用,这是推荐的方式(唯一方式),以分配字符串文本到char指针。这里,str1指向const个字符,即它们不能被修改。因此,在某处使用它是安全的,因为编译器会强制执行,因此将永远不会修改该文件。

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

+0

“'char * str1 =”string 1“;'C++ 11已弃用此代码”否。这在C++ 98中已被弃用,并且从C++ 11开始是_ill-formed_。 – cpplearner

+0

@cpplearner感谢您的信息:) – Rakete1111

2

char str2[] = "string 2";

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

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

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

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

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

const char* str1应该工作正常,从const char[]铸造const char *是有效的(他们几乎是同样的事情,除非你在编译过程中有机会获得原始阵列大小,然后将鼠标指针变体是​​尺寸小于向上兼容版本)。

+0

所以版本const char *是一个真正的指向数据段中字符串文字的指针。第二个版本 - char []是刚刚从字符串文字初始化的数组,通过从右手边值复制字符。这是对的吗? – amigo421