2010-12-05 43 views
2

我從以下兩個聲明和初始化打印出地址和字符串charArray和strPtr。問題是,「爲什麼?」字符*變量地址與炭[]可變地址

印刷:

printf("%10s%40s%20p\n", "strPtr", strPtr, &(*strPtr));  
    printf("%10s%40s%20p\n", "charArray", charArray, charArray); 

輸出:

strPtr  This is a string, made on the fly.   0x400880  
charArray   Chars in a char array variable.  0x7fff12d5ed30 

不同的地址,你看,主要有:0x400880與0x7fff12d5ed30

的變量在此之前有地址聲明的休息像charArray那樣。

同樣,問題是,「爲什麼地址如此不同?」 感謝您的幫助。

+4

只是一些建議;聲明指向字符串文字的指針更爲有利,例如`const char * str =「string」;`。這有助於防止試圖修改字符串文字的未定義行爲。 – dreamlax 2010-12-05 03:33:04

回答

3

我猜測編譯器/鏈接器將char數組放入堆棧,而將另一個字符串放入靜態字符串表中。

4

因爲字符串文字,例如「foo bar」被分配到一個「不同的地方」,而不是你的char數組。

這是實現相關,但典型的實現將會把字符串字面量在.rdata(「只讀數據」)的可執行文件的部分,你的字符數組的局部聲明,並因此進入堆疊上。

當你的圖片加載到RAM中時,你的圖片的不同部分將被映射到大不相同的地址。

2

文本「字符數組變量中的字符」。和「這是一條飛翔的繩子。」可能彼此很接近。但是,char charArray[] = ...請求將相應位文本複製到的堆棧中的空間。這個堆棧實際上與原始硬編碼文本在不同的領域,一旦操作系統完成其虛擬化等。

2

這是怎麼回事 - 我記得在[Unix:Systems Programming]

1alt text

,你可以看到初始化的靜態數據都存儲在不同的位置上堆相對於未初始化的靜態數據。

1

在這裏實現的關鍵一點是,在strPtr的情況下,你是在處理不同的對象,而在charArray的情況下,你面對的只是一個

charArray是一個單個數組對象,填充了字符串"Chars in a char array variable."的字符。

strPtr本身是一個單一的指針對象。它的值是第二個匿名,不可修改的數組對象的地址,該對象又包含"This is a string, made on the fly."字符串的字符。

當使用%p打印charArray時,您打印的地址爲charArray[0](由於數組的特殊規則)。當您打印&(*strPtr)(與strPtr完全相同)時,您正在打印前面提到的匿名,不可修改的數組對象的地址 - 這就是爲什麼它與所涉及的其他變量的地址顯得如此不同。

如果使用%p打印出&strPtr,則會看到變量strPtr本身的地址與其他本地變量的範圍相似。