为什么在指针和数组的情况下,字符数组的处理方式不同
Why are character arrays treated differently in case of pointers and arrays?
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
未指定这些数组是否不同,前提是它们的 元素具有适当的值。如果程序尝试 修改这样的数组,行为是未定义的。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符