【发布时间】:2018-01-06 13:37:06
【问题描述】:
char *char_ptr = "anisha";
char char_arr[]= "anisha";
第一个内存位置的内容不能修改而第二个内存位置的内容可以修改的“原因是什么?
为什么第一个内存存储的是常量字符串,而第二个不是?
【问题讨论】:
char *char_ptr = "anisha";
char char_arr[]= "anisha";
第一个内存位置的内容不能修改而第二个内存位置的内容可以修改的“原因是什么?
为什么第一个内存存储的是常量字符串,而第二个不是?
【问题讨论】:
因为指针和数组是不同的东西。
对于第一种情况,char_ptr 是指向 string literal 的指针,其内容无法修改。而试图通过指针修改它们的是UB。 (这就是为什么从 C++11 开始我们必须把它写成const char *char_ptr = "anisha";。)
尝试修改字符串文字会导致未定义的行为:它们可能存储在只读存储中(例如 .rodata)或与其他字符串文字组合:
对于第二种情况,char_arr 是一个数组,其内容是从字符串文字复制而来的。内容为数组本身所有,修改即可。
字符串字面量可用于初始化字符数组。如果数组初始化为
char str[] = "foo";,str将包含字符串"foo"的副本。
【讨论】:
First 是一个 堆栈分配的指针,指向在字符串文字的某些不可变存储中分配的字符数组中的第一项。指针本身是可变的,但它指向的数据不是。
Second 是一个由 7 个字符组成的 堆栈分配数组,仅使用来自字符串文字的数据进行初始化。整个数组是可变的,因为它是在堆栈上分配的。
【讨论】:
因为第一个是您要分配其地址的字符串文字。并且字符串文字是不可修改的。尽管它看起来与第二种情况相似,但事实并非如此。作为数组的字符串文字衰减为分配给char*的指针。
第二个是简单地初始化一个本地char 数组。这里只是用字符串文字初始化数组的元素。这是可以修改的。
char char_arr[]= {'a','n','i','s','h','a','\0'};
这是可以修改的,就像普通的 char 数组一样。
不确定这些数组是否是不同的,只要它们的 元素具有适当的值。 如果程序试图 修改这样的数组,行为未定义。
【讨论】: