在C++11中,不能直接将char指针初始化为字符串文本。
在早期版本的C++中,我可以毫无问题地做到这一点。
如果允许使用以下代码:
char arr[] = "Hello";
char *p_str1 = arr; //allowed那么为什么不允许使用下面的代码呢?
char *p_str3 = "Hello"; //Not allowed注意:我知道添加const将修复。但我需要知道原因。
发布于 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被禁止之后,但据我所知,试图修改这些字符串文本的尝试总是未定义的行为。
发布于 2021-04-06 22:54:17
这是因为C++理解字符串常量将存储在不可修改的内存中,因此必须将其标记为const。在许多编译器中,这都存储在只读数据段中。
任何修改该字符串的尝试都可能导致分段错误。
在第一种情况下,您实际上是在复制到本地数组。这是可以修改的。
https://stackoverflow.com/questions/66977448
复制相似问题