当我们做的时候
char *p ="house";
p = 'm';
不允许。
但是当我们做的时候
char p[] = "house";
p[0] = 'm';
printf(p);
它给O / P as:mouse
我无法理解C如何以及在何处为字符串文字进行内存分配?
答案 0 :(得分:6)
char p[] = "house";
"house"
是存储在只读位置的字符串文字,但是,p是放在堆栈中的字符数组,其中"house"
被复制。
但是,在char *p = "house";
中,p
实际上指向包含字符串文字“house”的只读位置,因此修改它是UB。
标准6.7.8 Initialization
14字符串数组可以用字符串初始化 文字,可选择括在括号中。连续的人物 字符串文字(包括终止空字符if) 有空间或者如果数组的大小未知)初始化 数组的元素。
所以你基本上有一个字符数组。如果您使用ints
,floats
等数组,理解如何修改此数组应该不会那么困难或难以理解。
答案 1 :(得分:0)
char *p = "house"; // const char* p = "house";
字符串文字"house"
位于只读位置,无法修改。现在你正在做的是 -
*p = 'm' ; // trying to modify read-only location; Missed the dereferencing part
现在,
char p[] = "house";
"house"
被复制到数组p。所以,它的内容是可修改的。所以,这确实有效。
p[0] = 'm'; // assigning `m` at 0th index.
答案 2 :(得分:0)
当你使用char * p =“house”时 - 编译器收集所有“house”字符串并将它们放在一个只读空间中。
当你使用char p [] =“house”时,编译器会为字符串创建一个空间作为本地作用域中的数组。
基本区别在于1000的指针可以共享第一个(这就是为什么你不能修改),第二个指针是作用域的本地 - 所以只要它保持相同的大小就可以修改。