gpt4 book ai didi

c++ - char * = "stringLiteral"的 C 和 C++ 字符串文字弃用;

转载 作者:太空宇宙 更新时间:2023-11-04 05:10:35 25 4
gpt4 key购买 nike

我知道语法 char * = "stringLiteral"; 已被弃用,甚至可能在未来不起作用。我不明白的是为什么

我搜索了网络和堆栈,尽管有很多回声确认 char * = "stringLiteral";是错误的,const char * = "stringLiteral";是正确的,我还没有找到关于为什么说语法错误的信息。换句话说,我想知道幕后真正的问题是什么。

说明我的困惑

代码段 1 - EVIL WAY(已弃用)

char* szA = "stringLiteralA";     //Works fine as expected. Auto null terminated.
std::cout << szA << std::endl;
szA = "stringLiteralB"; //Works, so change by something same length OK.
std::cout << szA << std::endl;
szA = "stringLiteralC_blahblah"; //Works, so change by something longer OK also.
std::cout << szA << std::endl;

Ouput:
stringLiteralA
stringLiteralB
stringLiteralC_blahblah

那么这里到底有什么问题呢?似乎工作正常。

代码段 2(“OK”方式)

const char* szA = "stringLiteralA";  //Works fine as expected. Auto null term.
std::cout << szA << std::endl;
szA = "stringLiteralB"; //Works, so change by something same length OK.
std::cout << szA << std::endl;
szA = "stringLiteralC_blahblah"; //Works, so change by something longer OK also.
std::cout << szA << std::endl;

Ouput:
stringLiteralA
stringLiteralB
stringLiteralC_blahblah

也很好用。没有不同。添加const有什么意义?

代码段 3

const char* const szA = "stringLiteralA";  //Works. Auto null term.
std::cout << szA << std::endl;
szA = "stringLiteralB"; //Breaks here. Can't reasign.

我只是在这里说明,为了只读保护变量内容,你必须 const char* const szA = "something"; .

我看不到弃用或任何问题的意义。为什么此语法已弃用并被视为问题?

最佳答案

const char * 是指向常量 (const) 的指针 (*) char (指针定义很容易从右到左阅读)。这里的重点是保护内容,因为正如标准所说,修改此类指针的内容会导致未定义的行为。

这源于这样一个事实,即通常 (C/C++) 编译器将整个程序中使用的字符串分组在一个内存区域中,并且允许对不相关部分中使用的相同字符串的实例使用相同的内存位置程序的大小(以最小化可执行文件大小/内存占用)。如果允许修改字符串文字,您可能会通过更改影响同一文字的其他不相关实例,这显然不是一个好主意。

事实上,对于大多数现代编译器(在支持内存保护的硬件上),字符串表的内存区域是只读的,因此如果您试图修改字符串文字,您的程序就会崩溃。将 const 添加到引用字符串文字的指针会使这些错误立即显现为编译错误而不是崩溃。

顺便说一句,请注意字符串文字可以隐式衰减为非常量 char * 这一事实只是为了向后兼容标准库(当 时编写) const 还不是 C 语言的一部分),正如上面所说,标准总是说改变字符串文字是 UB。

关于c++ - char * = "stringLiteral"的 C 和 C++ 字符串文字弃用;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com