2012-09-27 45 views
1

請問有人可以解釋一下,函數返回的結構變量是如何實現的。基本上當函數返回一個變量時,該值將被放入寄存器並返回。但在結構回報的情況下,這將如何工作。我假設該結構將被複制到某個全局位置並返回指針。這將由編譯器進行管理。我的理解是否正確?從C函數返回結構的機制是什麼?

這是

#include <stdio.h> 
#include <stdlib.h> 

typedef struct ss 
{ 
    char name[10]; 
    int val; 
} HELLO; 


HELLO *ptr=NULL; 

HELLO myfun() 
{ 
    HELLO hel = {"Salil", 20}; 
    ptr = &hel; 
    return hel; 
} 
main() 
{ 

    HELLO hel1; 
    hel1 = myfun(); 
    if (ptr) printf("The val = %s \n", ptr->name); 
} 

在這裏,在myfun,如何將hel變量返回我什麼樣的程序?變量在返回時將保存在哪裏?

+2

Orr剛剛設置爲棧上的變量這個問題取決於您使用的調用約定。不要讓指針指向堆棧上的變量,並且要求調用者使用它。它會失敗並且難以檢測爲什麼 –

回答

0

只要我們在談論C,就不能只返回一個結構體的指針。假設您通過malloc/calloc爲您的struct分配了空間,它將返回指針。很難判斷它是否會返回到寄存器或堆棧中,這取決於優化級別。

+3

-1:不正確,C至少允許從最初的C89 ANSI標準返回結構,以及之前的許多實現。 –

3

它取決於編譯器和目標的ABI。有的,我已經看到:

  • 多個寄存器:小結構可以在多個寄存器中的一些ABI

  • 全局緩衝區返回:一個緩衝區可以某處分配的主叫方和被叫方都知道的。

  • 堆棧,調用者的框架:調用者可以在堆棧上分配額外的空間,並將該空間的地址作爲隱藏的額外參數傳遞給該函數。

  • 替換args的堆棧:在被調用者從堆棧彈出args的ABI中,它可能會用返回值替換它們。

+0

感謝您的回答。有沒有什麼辦法可以看到這個機制如何使用objdump或某些東西。 –

+0

如果你反彙編這個函數,或者只是用-S編譯,那麼你可以閱讀這個程序集,看看編譯器在做什麼。 – Will