C程序字符串文字
当我们这样做
char *p ="house"; p = 'm';
这不被允许。
但是当我们做的时候
char p[] = "house"; p[0] = 'm'; printf(p);
它给O / P:鼠标
我无法理解C如何以及在何处为字符串文字进行内存分配?
char p[] = "house";
"house"
是存储在只读位置的字符串文字,但是,p是放置在堆栈中的字符数组,其中复制了"house"
。
但是,在char *p = "house";
, p
实际上指向包含字符串文字“house”的只读位置,因此修改它是UB。
标准6.7.8 Initialization
注释
14字符类型数组可以由字符串文字初始化,可选地用大括号括起来。 字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
所以你基本上有一个字符数组。 如果您使用了ints
, floats
等数组,那么理解如何修改此数组应该不会那么困难或难以理解。
当您使用char * p =“house”时 – 编译器会收集所有“house”字符串并将它们放在一个只读空间中。
当您使用char p [] =“house”时,编译器会将字符串的空间创建为本地范围中的数组。
基本区别在于1000的指针可以共享第一个(这就是为什么你不能修改),第二个指针是作用域的本地 – 所以只要它保持相同的大小就可以修改。
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.