C程序字符串文字

时间:2011-10-15 00:01:46

标签: c

当我们做的时候

char *p ="house";
 p = 'm';

不允许。

但是当我们做的时候

 char p[] = "house";
 p[0] = 'm';
 printf(p);

它给O / P as:mouse

我无法理解C如何以及在何处为字符串文字进行内存分配?

3 个答案:

答案 0 :(得分:6)

char p[] = "house";

"house"是存储在只读位置的字符串文字,但是,p是放在堆栈中的字符数组,其中"house"被复制。

但是,在char *p = "house";中,p实际上指向包含字符串文字“house”的只读位置,因此修改它是UB。

标准6.7.8 Initialization

中的注释
  

14字符串数组可以用字符串初始化   文字,可选择括在括号中。连续的人物   字符串文字(包括终止空字符if)   有空间或者如果数组的大小未知)初始化   数组的元素。

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

答案 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的指针可以共享第一个(这就是为什么你不能修改),第二个指针是作用域的本地 - 所以只要它保持相同的大小就可以修改。