C++11 char 数组初始化和字符串文字
C++11 char array intializations and string literals
在 C++11 中,char
指针不能直接初始化为字符串文字。
在早期版本的 C++ 中,我可以毫无问题地执行此操作。
如果允许以下代码:
char arr[] = "Hello";
char *p_str1 = arr; //allowed
那为什么下面的代码不被允许?
char *p_str3 = "Hello"; //Not allowed
注意:我知道添加 const
会解决问题。但我需要知道原因。
这是因为C++理解字符串常量将存储在不可修改的内存中,所以必须标记为const
。在许多编译器中,它存储在只读 data segment.
中
任何修改该字符串的尝试都可能导致分段错误。
在第一种情况下,您实际上是在复制一个本地数组。这是可以修改的。
char arr[] = "Hello"
将字符串文字 "Hello"
的可修改副本存储在字符数组 arr
中。 p_str1
是指向那个数组的指针,数据是可以修改的,所以指针不需要是const
.
char *p_str3 = "Hello"
是直接指向只读字符串文字的指针。指针不 拥有 字符串文字,它们通常存储在内存的某些只读部分中,无论哪种方式,您都可以访问数据,但不能修改它,因此使 const
指针成为必需的可以避免在运行时出现意外问题。
C++ 标准不允许非常量指针指向不可修改的数据。这是幸运的,因为它通过尝试修改它来避免未定义的行为,就像在不存在此规则的 C 中经常发生的那样。
在 C++03 中使用非 const char
指针仍然是合法的(可能是出于兼容性原因),当它被弃用时,在 C++11 之后它被禁止了,但就目前而言我可以告诉尝试修改这些字符串文字总是未定义的行为。
在 C++11 中,char
指针不能直接初始化为字符串文字。
在早期版本的 C++ 中,我可以毫无问题地执行此操作。
如果允许以下代码:
char arr[] = "Hello";
char *p_str1 = arr; //allowed
那为什么下面的代码不被允许?
char *p_str3 = "Hello"; //Not allowed
注意:我知道添加 const
会解决问题。但我需要知道原因。
这是因为C++理解字符串常量将存储在不可修改的内存中,所以必须标记为const
。在许多编译器中,它存储在只读 data segment.
任何修改该字符串的尝试都可能导致分段错误。
在第一种情况下,您实际上是在复制一个本地数组。这是可以修改的。
char arr[] = "Hello"
将字符串文字 "Hello"
的可修改副本存储在字符数组 arr
中。 p_str1
是指向那个数组的指针,数据是可以修改的,所以指针不需要是const
.
char *p_str3 = "Hello"
是直接指向只读字符串文字的指针。指针不 拥有 字符串文字,它们通常存储在内存的某些只读部分中,无论哪种方式,您都可以访问数据,但不能修改它,因此使 const
指针成为必需的可以避免在运行时出现意外问题。
C++ 标准不允许非常量指针指向不可修改的数据。这是幸运的,因为它通过尝试修改它来避免未定义的行为,就像在不存在此规则的 C 中经常发生的那样。
在 C++03 中使用非 const char
指针仍然是合法的(可能是出于兼容性原因),当它被弃用时,在 C++11 之后它被禁止了,但就目前而言我可以告诉尝试修改这些字符串文字总是未定义的行为。