簡體   English   中英

在C中:為什么在函數之外存在堆棧分配結構?

[英]in C: Why does a stack allocated structure exist outside of the function?

我的功能:

struct hostent * gethost(char * hostname){
    if(/*some condition under which I want 
         to change the mode of my program to not take a host*/){
       return null
    }
    else{
        struct hostent * host = gethostbyname(hostname);
        return host;
    }
}

在主要:

struct hostent * host = gethost(argv[2]);

(忽略代碼中的任何小錯誤,我從內存中噴出)

這很好用。 盡管事實上我沒有自由,但Valgrind並沒有告訴我,我正在失去記憶。

為什么? 我認為在堆棧上分配的東西會隨着函數調用返回而消失? 或者是因為我返回指針? 這有什么危險嗎?

host沒有在堆棧上分配,只有指向它的指針在堆棧上。 函數返回時會復制指針,因此代碼沒有任何問題。

請注意, gethostbyname實際上並不動態分配內存。 它總是返回一個指向同一個靜態分配的內存塊的指針,這就是valgrind不報告泄漏的原因。 但要小心,因為這意味着如果要稍后保存值,則必須復制函數返回的hostent ,因為對gethost進一步調用將覆蓋它。

它很好並且確實泄漏,因為返回的指針不指向堆棧或堆上的數據,而是指向一些靜態變量。

http://linux.die.net/man/3/gethostbyname

函數gethostbyname()和gethostbyaddr()可能會返回指向靜態數據的指針,這些指針可能會被以后的調用覆蓋 復制struct hostent是不夠的,因為它包含指針; 需要深層復印件。

從手冊:

RETURN VALUE
       The gethostbyname() and gethostbyaddr() functions  return  the  hostent
       structure  or a NULL pointer if an error occurs.  On error, the h_errno
       variable holds an error number.  When non-NULL, the  return  value  may
       point at static data, ...

一些內存在編譯時保留(即在二進制代碼內部)為結構保留,該函數返回一個指向該內存的指針。

好吧,在所有對它的引用都丟失之前,內存不會被泄露,在你的例子中,指針被返回,所以仍然有對它的引用。

然而,對於大多數情況而言,依賴於代碼的另一部分來釋放動態內存是一個糟糕的設計決策。 如果函數需要返回一個結構,例如,調用者應該這樣做並傳遞指向結構的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM