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字符类型数组可以由字符串文字初始化,可选地用大括号括起来。 字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

所以你基本上有一个字符数组。 如果您使用了intsfloats等数组,那么理解如何修改此数组应该不会那么困难或难以理解。

当您使用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.