据我所知,语法char*=“stringLiteral”;已被弃用,将来甚至可能不起作用。我不明白的是为什么。
我搜索了网络和堆栈,虽然有很多回声确认char*=“stringLiteral”;是错误的,constchar*=“stringLiteral”;是正确的,但我还没有找到为什么说的语法是错误的信息。换言之,我想知道幕后到底有什么问题。
幻想我的困惑
代码段1-邪恶的方式(不推荐)

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(“正常”方式)
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的C&C++字符串文字弃用* =“stringLiteral”;,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13275162/

10-11 23:02
查看更多