为什么在指针和数组的情况下,字符数组的处理方式不同?

时间:2018-01-06 13:37:06

标签: c++ c arrays pointers

char *char_ptr = "anisha";

char char_arr[]= "anisha";

什么是" 原因 "第一个内存位置的内容不能修改,但第二个内存的内容可以吗?

为什么 是第一个存储空间的常量字符串,而第二个是不是<?p?

3 个答案:

答案 0 :(得分:3)

For C ++

因为指针和数组是不同的东西。

对于第一种情况,char_ptr是指向string literal的指针,其内容无法修改。并尝试通过指针修改它们是UB。 (这就是为什么从C ++ 11开始我们必须把它写成const char *char_ptr = "anisha";。)

  

尝试修改字符串文字会导致未定义的行为:它们可能存储在只读存储(例如.rodata)中或与其他字符串文字结合使用:

对于第二种情况,char_arr是一个数组,其内容是从字符串文字中复制的。内容由数组本身拥有,然后可以修改。

  

字符串文字可用于初始化字符数组。如果数组初始化为char str[] = "foo";,则str将包含字符串"foo"的副本。

答案 1 :(得分:2)

首先是堆栈分配指针到分配在字符串文字的某个不可变存储器的字符数组的第一项。指针本身是可变的,但它指向的数据不是。

第二个是7个字符的堆栈分配的数组,仅使用字符串文字中的数据进行初始化。整个数组是可变的,因为它是在堆栈上分配的。

答案 2 :(得分:2)

因为第一个是您要分配的地址的字符串文字。字符串文字是不可修改的。虽然看起来与第二种情况类似,但事实并非如此。作为数组的字符串文字衰变为指向char*的指针。

第二个就是初始化本地char数组。这里只是用字符串文字初始化数组元素。这是可以修改的。

char char_arr[]= {'a','n','i','s','h','a','\0'};

这可以修改,因为普通的char数组可以。

来自C11 standard 6.4.5p7

  

未指明这些数组是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。