在大多數編譯器中,當字符串值直接分配給指針時,它存儲在只讀塊(通常在數據段中)。
這是功能之間共享。
當你說char *str = "Test";
「測試」被存儲在一個共享的只讀位置,但指針str
存儲在讀寫存儲器和str
所指向的內存位置中,只讀位置。當您將相同的字符串分配給不同的指針時, 稱爲char* str2 = "Test";
。 str2
指針將指向只讀內存位置的相同地址,這就是輸出相同的原因。
以下代碼將失敗;該程序會崩潰,因爲你正在試圖改變只讀字符串:
int main() {
char *str;
str = "Test"; // Stored in read only part of data segment
*(str+1) = 'n'; // Trying to modify read only memory. segfault
getchar();
return 0;
}
使用char
陣列是由創建與char
指針字符串創建不同的字符串;該char
陣列將被創建就像在C.
例如其他類型的陣列, 如果str[]
是一個自動可變然後字符串存儲在堆棧段。 如果str[]
是全局或靜態變量,則存儲在數據段中。
int main() {
char str[] = "Test"; // Stored in stack segment like other auto variables
*(str+1) = 'n'; //This is fine
getchar();
return 0;
}
下面的代碼澄清事情:
#include <stdio.h>
char s1[] = "Test"; //Global in data segment
int main() {
char *s2 = "Test"; //Read only
char *s3 = "Test"; //pointed to a string in a Read only memory
char s4[] = "Test"; //stack segment
char s5[] = "Test"; //another array in stack segment
printf("\n%p",s1);
printf("\n%p",s2);
printf("\n%p",s3);
printf("\n%p",s4);
printf("\n%p",s5);
return 0;
}
會打印出這樣的事情。
6294408
4196492
4196492
1092092672
1092092656
所以你可以看到,s1
,s4
和s5
地址不同。
你有五個'printf's和只有兩行輸出。你的輸出是什麼,真的嗎? –
相關問題:請參閱http://stackoverflow.com/questions/19333602/get-address-of-a-string-constant-in-c/19334244#19334244 – smRaj
「它爲s2和s3打印相同的地址」 - 是,所以?你爲什麼期望他們會不同? –