微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++11 字符数组初始化和字符串文字

如何解决C++11 字符数组初始化和字符串文字

在 C++11 中,char 指针不能直接初始化为字符串字面量。
在早期版本的 C++ 中,我可以毫无问题地做到这一点。

如果允许以下代码

char arr[] = "Hello";
char *p_str1 = arr;  //allowed

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

char *p_str3 = "Hello"; //Not allowed

注意:我知道添加 const解决问题。但我需要知道原因。

解决方法

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

char *p_str3 = "Hello" 是一个直接指向只读字符串文字的指针。指针不拥有字符串文字,它们通常存储在内存的某个只读部分中,无论哪种方式您都可以访问数据,但不能修改它,因此const 指针是必需的,可避免运行时出现不希望出现的问题。

C++ 标准不允许非常量指针指向不可修改的数据。这是幸运的,因为它通过尝试修改的方式避免了未定义的行为,这在 C 中经常发生,而该规则不存在。

在 C++03 中使用非常量 char 指针仍然是合法的(可能是出于兼容性原因),当它被弃用时,在 C++11 之后它被禁止,但据我所知告诉尝试修改这些字符串文字总是未定义的行为。

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。