首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++11字符数组输入和字符串文本

C++11字符数组输入和字符串文本
EN

Stack Overflow用户
提问于 2021-04-06 22:50:29
回答 2查看 570关注 0票数 1

在C++11中,不能直接将char指针初始化为字符串文本。

在早期版本的C++中,我可以毫无问题地做到这一点。

如果允许使用以下代码:

代码语言:javascript
运行
复制
char arr[] = "Hello";
char *p_str1 = arr;  //allowed

那么为什么不允许使用下面的代码呢?

代码语言:javascript
运行
复制
char *p_str3 = "Hello"; //Not allowed

注意:我知道添加const将修复。但我需要知道原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-06 23:01:46

char arr[] = "Hello"将字符串文本"Hello"的可修改副本存储在char数组arr中。p_str1是指向该数组的指针,数据是可修改的,因此指针不需要是const

char *p_str3 = "Hello"是直接指向只读字符串文字的指针.指针不拥有字符串文本,通常这些字符串存储在内存的某些只读部分,无论通过哪种方式,您都可以访问数据,但是您不能修改它,因此强制使用const指针可以避免运行时出现不想要的问题。

C++标准不允许指向不可修改数据的非const指针。这是幸运的,因为它通过尝试修改它来避免未定义的行为,就像在不存在此规则的C中经常发生的那样。

在C++03中使用非const C++03指针仍然是合法的(可能是因为兼容性原因),当它被取消推荐时,在C++11被禁止之后,但据我所知,试图修改这些字符串文本的尝试总是未定义的行为。

票数 4
EN

Stack Overflow用户

发布于 2021-04-06 22:54:17

这是因为C++理解字符串常量将存储在不可修改的内存中,因此必须将其标记为const。在许多编译器中,这都存储在只读数据段中。

任何修改该字符串的尝试都可能导致分段错误。

在第一种情况下,您实际上是在复制到本地数组。这是可以修改的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66977448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档