Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11字符数组初始化和字符串文本_C++_Arrays_C++11_Pointers_String Literals - Fatal编程技术网

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

C++11字符数组初始化和字符串文本,c++,arrays,c++11,pointers,string-literals,C++,Arrays,C++11,Pointers,String Literals,在C++11中,字符指针不能直接初始化为字符串文本。 在C++的早期版本中,我可以不做任何事情。 如果允许使用以下代码: 那么为什么下面的代码是不允许的? 注意:我知道添加const可以解决这个问题。但我需要知道原因。 这是因为C++理解字符串常量将存储在非可修改内存中,因此必须标记为const。在许多编译器中,这是以只读方式存储的 任何修改该字符串的尝试都可能导致分段错误 在第一种情况下,实际上是将副本复制到本地阵列。这是可以修改的。 这是因为C++理解字符串常量将存储在非可修改内存中,因此必

在C++11中,字符指针不能直接初始化为字符串文本。 在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