2013-10-19 33 views
2

我正在嘗試下面的代碼。c程序打印字符串的相同地址,c程序的意外輸出

  #include <stdio.h> 


      int main() { 
        char *s2 = "Test"; 
        char *s3 = "Test"; 


        printf("\n%u",s2); 
        printf("\n%u",s3); 

        return 0; 
      } 

當我執行此代碼時,我得到以下輸出。

  4196492 
      4196492 

爲什麼輸出是這樣的?它爲s2和s3輸出相同的地址

+4

你有五個'printf's和只有兩行輸出。你的輸出是什麼,真的嗎? –

+0

相關問題:請參閱http://stackoverflow.com/questions/19333602/get-address-of-a-string-constant-in-c/19334244#19334244 – smRaj

+0

「它爲s2和s3打印相同的地址」 - 是,所以?你爲什麼期望他們會不同? –

回答

4

在大多數編譯器中,當字符串值直接分配給指針時,它存儲在只讀塊(通常在數據段中)。

這是功能之間共享。

當你說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 

所以你可以看到,s1s4s5地址不同。

0

因爲String被自動存儲爲內存中的引用類型,所以它被視爲本身的地址。如果將「TEST」作爲另一個指針存儲,則該指針將指向之前存儲「TEST」的相同地址。