为啥在指针和数组的情况下字符数组的处理方式不同? [复制]

Posted

技术标签:

【中文标题】为啥在指针和数组的情况下字符数组的处理方式不同? [复制]【英文标题】:Why are character arrays treated differently in case of pointers and arrays? [duplicate]为什么在指针和数组的情况下字符数组的处理方式不同? [复制] 【发布时间】:2018-01-06 13:37:06 【问题描述】:

char *char_ptr = "anisha";

char char_arr[]= "anisha";

第一个内存位置的内容不能修改而第二个内存位置的内容可以修改的“原因是什么?

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

【问题讨论】:

【参考方案1】:

对于 C++

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

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

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

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

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

【讨论】:

我想知道这一切背后的原因。 @Aquarius_Girl 你说的“为什么会这样”是什么意思? @Aquarius_Girl 你能让你的问题更具体吗?你的预期结果是什么?指针应该表现得像数组?反之亦然? 为什么不能修改字符串文字的内容? @Pablo 为什么编译器/链接器会阻止我们修改它? @Aquarius_Girl 对于 C++,标准说修改字符串文字是 UB。编译器不需要做任何事情来阻止这些事情,UB意味着编译器可以做任何事情。【参考方案2】:

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

Second 是一个由 7 个字符组成的 堆栈分配数组,仅使用来自字符串文字的数据进行初始化。整个数组是可变的,因为它是在堆栈上分配的。

【讨论】:

【参考方案3】:

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

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

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

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

来自C11 standard 6.4.5p7

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

【讨论】:

是的,我想学习 - 先生,我错过了什么吗?

以上是关于为啥在指针和数组的情况下字符数组的处理方式不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在数组中的值的情况下比较的工作方式不同

数组是指针? [重复]

C语言,用指针方式定义的字符串为啥不能修改?

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

C/C++语言指针用法详解 指针和数组

c++中字符串为啥有两种形式? c-style 和 string 有啥区别?