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

Why are character arrays treated differently in case of pointers and arrays?

本文关键字:数组 字符 处理 方式不 情况下 为什么 指针      更新时间:2023-10-16

char *char_ptr = "anisha";

char char_arr[]= "anisha";

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

为什么 第一个内存存储是常量字符串,而第二个不是?

For C++

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

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

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

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

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

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

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

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

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

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

这是可以修改的,就像普通的字符数组一样。

C11 标准 6.4.5p7

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