簡體   English   中英

C程序字符串文字

[英]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字符類型數組可以由字符串文字初始化,並可選地用大括號括起來。 字符串文字的連續字符(如果有空間或數組大小未知,則包括終止空字符)將初始化數組的元素。

因此,您基本上有一個字符數組。 如果您使用過intsfloats等數組,那么理解該數組如何被修改應該不會太困難或使您困惑。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM