亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

char s []和char * s有什么區別?

char s []和char * s有什么區別?

一只甜甜圈 2019-05-23 10:01:55
在C中,可以在聲明中使用字符串文字,如下所示:char s[] = "hello";或者像這樣:char *s = "hello";那么區別是什么呢?我想知道在編譯和運行時的存儲持續時間實際發生了什么。char s []和char * s有什么區別?
查看完整描述

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指針變量在內存中的位置取決于聲明出現的位置(就像在第一個示例中一樣)。


查看完整回答
反對 回復 2019-05-23
?
慕桂英3389331

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元素的數組charconst char在C ++中),具有靜態存儲持續時間,這意味著它的內存在程序啟動時分配,并保持分配直到程序終止。嘗試修改字符串文字的內容會調用未定義的行為。

這條線

char *s0 = "hello world";

定義s0char具有自動存儲持續時間的指針(意味著該變量s0僅存在于聲明它的范圍內)并將字符串文字的地址0x00008000在此示例中)復制到它。請注意,由于s0指向一個字符串字面量,它不應該被用來作為一個參數,將試圖修改它的任何功能(如strtok()strcat(),strcpy(),等)。

這條線

char s1[] = "hello world";

定義s1char具有自動存儲持續時間的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為指向其他數組。


查看完整回答
反對 回復 2019-05-23
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

char s[] = "hello";

聲明s是一個數組,char其長度足以保存初始化器(5 + 1 char)并通過將給定字符串文字的成員復制到數組中來初始化數組。

char *s = "hello";

聲明s是指向一個或多個(在本例中為更多)char的指針,并將其直接指向包含文字的固定(只讀)位置"hello"


查看完整回答
反對 回復 2019-05-23
  • 5 回答
  • 0 關注
  • 2101 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號