[英]C Program String Literals
當我們做
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"; // 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.
當您使用char * p =“ house”時-編譯器會收集所有的“ house”字符串,並將它們放在一個只讀空間中。
當您使用char p [] =“ house”時,編譯器會在本地范圍內為字符串創建空間作為數組。
基本區別在於,1000個指針可以共享第一個指針(這就是為什么您不能修改),而第二個指針則是作用域局部的-只要它保持相同的大小就可以修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.