2013-10-12 32 views
0

字符串常量,我想獲得一個在C.得到一個地址用C

char * const MYCONST = "StringString"; 

字符串常量的地址據我所知consts在文本/代碼段「拯救」的記憶。 當我試圖讓第一個元素的地址MYCONST:

printf("%p\n",&(MYCONST)); 

至於結果我得到0x7fff15342e28,這是在棧,而不是在文本/代碼segement。 任何人都可以請幫我在C中得到一個字符串常量的地址嗎?

//編輯 我無法找到正確的答案至今:當我寫

char * const MYCONST1 = "StringString"; 
    printf("Address of MYCONST1: %p\n",MYCONST1); 

    char * const MYCONST2 = "StringString"; 
    printf("Address of MYCONST2: %p\n",(void*)MYCONST2); 

這是輸出:

MYCONST1地址:0x400b91

MYCONST2地址:0x400b91

但他們應該有不同的地址,因爲它們是不同的常量。 任何人都可以解釋我,而結果長度爲七,而不是0x7fffa5dd398c像一個區域設置變量。

謝謝!

回答

2

問: //編輯我無法找到正確的答案至今:當我寫

char * const MYCONST1 = "StringString"; 
printf("Address of MYCONST1: %p\n",MYCONST1); 

char * const MYCONST2 = "StringString"; 
printf("Address of MYCONST2: %p\n",(void*)MYCONST2); 

這是輸出:

Address of MYCONST1: 0x400b91 

Address of MYCONST2: 0x400b91 

但他們應該有不同的地址,因爲它們是不同的常量。


答:由於兩個指針指向相同的字符串常量。編譯器優化並讓它們共享相同的數據,並因此共享相同的地址。嘗試編譯你的代碼

gcc program_name.c -O 

並參見。你會看到不同的地址。

相對:Addresses of two pointers are same

1

C字符串的第一個字符的地址位於字符串本身的變量中,即您的情況中的MYCONST。

5

由於MYCONST已經是一個指針,所以不需要&符號。所有你需要的是一個強制轉換爲void*%p

printf("%p\n",(void*)MYCONST); 

與符號,您打印MYCONST局部變量的地址(你需要一個void*鑄有作爲,否則,地址可能打印不正確)這確實位於堆棧上。

3
printf("%p\n",(void *) &MYCONST); 

打印MYCONST指針變量的地址。

printf("%p\n", (void *) MYCONST); 

打印MYCONST指針變量的值。

+0

當我試圖讓指針值的地址:0x7fff70f54bb8。我認爲這不可能是正確的,因爲常量在代碼段中,並且此地址屬於堆棧? –

1
char * const MYCONST = "StringString"; 

初始化指針MYCONST,使其指向存儲該字符串文字的內存。
要打印此字符串的地址,使用指針的值的

printf("%p\n", (void*) MYCONST); 

代替

printf("%p\n", (void*) &MYCONST); 

它打印指針本身的地址。

1
printf("%p\n",(void*)MYCONST); 

將打印字符串MYCONST指向的第一個元素的地址。

之所以沒有在MYCONST之前放&是因爲MYCONST已經是指針了。

如果您需要打印address of Pointer,那麼您需要像&MYCONST那樣做。

+0

不會。它不會打印'MYCONST'的地址。它將打印字符串的第一個字符的地址。 – haccks

+0

@haccks yep我做了更正。這是一個錯字。我試圖快速回答,但其他人比我更快:P –