5 回答
TA貢獻1895條經驗 獲得超7個贊
本聲明:
char s[] = "hello";
創建一個對象 - 一個char大小為6 的數組,稱為s,使用值初始化'h', 'e', 'l', 'l', 'o', '\0'。這個數組在內存中分配的位置,以及它的存在時間取決于聲明出現的位置。如果聲明在一個函數內,它將一直存在到聲明它的塊的結尾,并且幾乎肯定會在棧上分配; 如果它在函數之外,它可能存儲在“初始化數據段”中,該“初始化數據段”在程序運行時從可執行文件加載到可寫存儲器中。
另一方面,這個聲明:
char *s ="hello";
創建兩個對象:
包含值的只讀數組,
char包含值'h', 'e', 'l', 'l', 'o', '\0',沒有名稱且具有靜態存儲持續時間(意味著它在程序的整個生命周期中存在); 和一個名為pointer-to-char的變量,調用它
s,該變量使用該未命名的只讀數組中第一個字符的位置進行初始化。
未命名的只讀數組通常位于程序的“文本”段中,這意味著它從磁盤加載到只讀存儲器中,以及代碼本身。s指針變量在內存中的位置取決于聲明出現的位置(就像在第一個示例中一樣)。
TA貢獻2036條經驗 獲得超8個贊
鑒于聲明
char *s0 = "hello world";char s1[] = "hello world";
假設以下假設記憶圖:
0x01 0x02 0x03 0x04 0x00008000:'h''e''l''l' 0x00008004:'o''''w''o' 0x00008008:'r''l''d'0x00 ...s0:0x00010000:0x00 0x00 0x80 0x00s1:0x00010004:'h''e''l''l' 0x00010008:'o''''w''o' 0x0001000C:'r''l''d'0x00
字符串文字"hello world"是一個12元素的數組char(const char在C ++中),具有靜態存儲持續時間,這意味著它的內存在程序啟動時分配,并保持分配直到程序終止。嘗試修改字符串文字的內容會調用未定義的行為。
這條線
char *s0 = "hello world";
定義s0為char具有自動存儲持續時間的指針(意味著該變量s0僅存在于聲明它的范圍內)并將字符串文字的地址(0x00008000在此示例中)復制到它。請注意,由于s0指向一個字符串字面量,它不應該被用來作為一個參數,將試圖修改它的任何功能(如strtok(),strcat(),strcpy(),等)。
這條線
char s1[] = "hello world";
定義s1為char具有自動存儲持續時間的12元素數組(長度取自字符串文字),并將文字的內容復制到數組。從內存映射中可以看出,我們有兩個字符串副本"hello world"; 區別在于您可以修改其中包含的字符串s1。
s0并且s1在大多數情況下可以互換; 以下是例外情況:
sizeof s0 == sizeof (char*)sizeof s1 == 12type of &s0 == char **type of &s1 == char (*)[12] // pointer to a 12-element array of char
您可以重新分配變量s0以指向不同的字符串文字或另一個變量。您無法將變量重新指定s1為指向其他數組。
TA貢獻1770條經驗 獲得超3個贊
char s[] = "hello";
聲明s是一個數組,char其長度足以保存初始化器(5 + 1 char)并通過將給定字符串文字的成員復制到數組中來初始化數組。
char *s = "hello";
聲明s是指向一個或多個(在本例中為更多)char的指針,并將其直接指向包含文字的固定(只讀)位置"hello"。
- 5 回答
- 0 關注
- 2101 瀏覽
添加回答
舉報
