C++11字符数组初始化和字符串文本
在C++11中,字符指针不能直接初始化为字符串文本。 在C++的早期版本中,我可以不做任何事情。 如果允许使用以下代码: 那么为什么下面的代码是不允许的?C++11字符数组初始化和字符串文本,c++,arrays,c++11,pointers,string-literals,C++,Arrays,C++11,Pointers,String Literals,在C++11中,字符指针不能直接初始化为字符串文本。 在C++的早期版本中,我可以不做任何事情。 如果允许使用以下代码: 那么为什么下面的代码是不允许的? 注意:我知道添加const可以解决这个问题。但我需要知道原因。 这是因为C++理解字符串常量将存储在非可修改内存中,因此必须标记为const。在许多编译器中,这是以只读方式存储的 任何修改该字符串的尝试都可能导致分段错误 在第一种情况下,实际上是将副本复制到本地阵列。这是可以修改的。 这是因为C++理解字符串常量将存储在非可修改内存中,因此必
注意:我知道添加const可以解决这个问题。但我需要知道原因。
这是因为C++理解字符串常量将存储在非可修改内存中,因此必须标记为const。在许多编译器中,这是以只读方式存储的
任何修改该字符串的尝试都可能导致分段错误在第一种情况下,实际上是将副本复制到本地阵列。这是可以修改的。 这是因为C++理解字符串常量将存储在非可修改内存中,因此必须标记为const。在许多编译器中,这是以只读方式存储的 任何修改该字符串的尝试都可能导致分段错误 在第一种情况下,实际上是将副本复制到本地阵列。这是可修改的。char arr[]=Hello在char数组arr中存储字符串literal Hello的可修改副本。p_str1是指向该数组的指针,数据是可修改的,因此指针不需要为常量 char*p_str3=Hello是直接指向只读字符串文本的指针。指针不拥有字符串文字,通常这些文字存储在内存的某个只读部分中,无论哪种方式,您都可以访问数据,但不能修改数据,因此强制使用常量指针可以避免运行时出现不希望出现的问题
C++标准不允许非常量指针指向不可修改数据。这是幸运的,因为它通过尝试修改来避免未定义的行为,这在C语言中经常发生,而C语言中不存在此规则
在C++03中使用非常量字符指针仍然是合法的,可能是出于兼容性的原因,当它被弃用时,在C++11之后它被禁止,但据我所知,试图修改这些字符串文字始终是未定义的行为。char arr[]=Hello在char数组arr中存储字符串literal Hello的可修改副本。p_str1是指向该数组的指针,并且数据是可修改的,因此指针不需要是常量 char*p_str3=Hello是直接指向只读字符串文本的指针。指针不拥有字符串文字,通常这些文字存储在内存的某个只读部分中,无论哪种方式,您都可以访问数据,但不能修改数据,因此强制使用常量指针可以避免运行时出现不希望出现的问题C++标准不允许非常量指针指向不可修改数据。这是幸运的,因为它通过尝试修改来避免未定义的行为,这在C语言中经常发生,而C语言中不存在此规则
在C++03中使用非常量字符指针仍然是合法的,可能是出于兼容性原因,当它被弃用时,在C++11之后,它被禁止使用,但据我所知,尝试修改这些字符串文字始终是未定义的行为。IMHO从错误消息中可以清楚地看出原因。第二个与第一个类似,但const char arr[]=Hello@S.M.需要知道第一个与第二个相关的C问题是如何不同的:@ CEPB,我不知道任何C++实现都会为这两种情况执行堆分配。@ CEPB对您的注释的编辑使错误更大,而不是更少。这与跟踪动态内存分配的能力无关。从错误消息中可以清楚地看出原因。第二个与第一个类似,但const char arr[]=Hello@S.M.需要知道第一个与第二个相关的C问题是如何不同的:@ CEPB,我不知道任何C++实现都会为这两种情况执行堆分配。@ CEPB对您的注释的编辑使错误更大,而不是更少。这与跟踪动态内存分配的能力无关。第一种方法与第二种方法有何不同。需要澄清。字符串常量将不会存储在不可修改的内存中吗?在第一种情况下,您是说请创建一个本地数组,该数组包含以下内容的副本,并且在存储在堆栈上的大多数编译器上。任何修改该字符串的尝试都可能导致分段错误。或者更糟。我记得那个邪恶而神秘的总线错误。第一种方法与第二种方法有何不同。需要澄清。字符串常量将不会存储在不可修改的内存中吗?在第一种情况下,您是说请创建一个本地数组,该数组包含以下内容的副本,并且在存储在堆栈上的大多数编译器上。任何修改该字符串的尝试都可能导致分段错误。或者更糟。我记得那邪恶而神秘的公共汽车错误。只是个问题。所以在C++11之前,这个部分不是只读的?不,它可能仍然是只读的。允许非常量指针指向字符串文字是一个错误
非受迫性错误的常见来源,因此标准编写者决定咬紧牙关,将其正式定为非法。@SumaiyaA,我误解了你的问题,它从来都不可修改,实施const规则是为了避免试图修改它所产生的问题。@user4581301是的,这是我的主要困惑点。感谢您澄清该节始终是只读的,但修改它会导致错误。所以现在已经被正确地限制了。我不想说总是只读的。我不相信标准要求它直到今天都是只读的,只是它可能在只读内存中。我不擅长标准解析和语言法则,但一般来说C++标准不喜欢指定这样的细节。只有在C++20中,2s恭维在成为事实标准几十年后才成为一种要求。我相信会有一些奇怪的系统,文字是可以修改的,但我怀疑你会在实验室外看到一个。我从来没有见过。好的。只是个问题。所以在C++11之前,这个部分不是只读的?不,它可能仍然是只读的。允许非常量指针指向字符串文字是非强制错误的常见来源,因此标准编写者决定咬紧牙关,将其正式定为非法。@SumaiyaA,我误解了你的问题,它从来都不可修改,实施常量规则是为了避免试图修改它而产生的问题。@user4581301 Yea,这是我的主要困惑点。感谢您澄清该节始终是只读的,但修改它会导致错误。所以现在已经被正确地限制了。我不想说总是只读的。我不相信标准要求它直到今天都是只读的,只是它可能在只读内存中。我不擅长标准解析和语言法则,但一般来说C++标准不喜欢指定这样的细节。只有在C++20中,2s恭维在成为事实标准几十年后才成为一种要求。我相信会有一些奇怪的系统,文字是可以修改的,但我怀疑你会在实验室外看到一个。我从来没有见过。
char arr[] = "Hello";
char *p_str1 = arr; //allowed
char *p_str3 = "Hello"; //Not allowed