2010-07-11 52 views
9

此代碼片段在ANSI C中有很好的定義嗎? 在我的系統(Linux x86_64)上它似乎運行得很好並且打印出一個地址,但它會一直如此嗎?例如。該參數可能通過寄存器傳遞,並且認爲這個地址看起來不正確。採用函數參數的地址是否合法?

#include <stdio.h> 

void foo(int a) 
{ 
    printf("%p\n", &a); 
} 

int main(void) 
{ 
    foo(42); 
    return 0; 
} 

編輯:看起來像海灣合作委員會將把寄存器傳遞到堆棧之前的價值取得它的地址。

<foo>: 
    55      push rbp 
    48 89 e5    mov rbp,rsp 
    48 83 ec 10    sub rsp,0x10 
    89 7d fc    mov DWORD PTR [rbp-0x4],edi 
    b8 1c 06 40 00   mov eax,0x40061c 
    48 8d 55 fc    lea rdx,[rbp-0x4] 
    48 89 d6    mov rsi,rdx 
    48 89 c7    mov rdi,rax 
    b8 00 00 00 00   mov eax,0x0 
    e8 d8 fe ff ff   call 4003c0 <[email protected]> 
    c9      leave 
    c3      ret 

回答

8

是的,這是完全合法的 - 當然你不會從函數返回地址,因爲時間foo的回報,這是毫無意義的。

1

這是完全合法的。但是你需要考慮你的地址的範圍和生命週期。

如果您試圖將其從功能中傳回,那麼該地址可能不再指向有效數據。就像C中的大部分一樣,這讓你有能力在腳下自我射擊。

16

爲了解決您的疑惑:是的,參數可能是通過通過一個寄存器,但是當它成爲被調用函數中的局部變量時,就像任何其他局部變量一樣。如果地址被使用,編譯器將不得不確保它有一個真實的地址,通過它可以通過創建一個真正的堆棧變量來訪問它。如果沒有,編譯器可能能夠優化以將其保存在寄存器中,而不用在存儲器中實例化它。

+2

+1,你的回答比較完整:) – Stephen 2010-07-11 14:43:08

相關問題