2013-04-14 282 views
-1
struct trapframe { 
     u_int32_t tf_vaddr;  /* coprocessor 0 vaddr register */ 
     u_int32_t tf_status; /* coprocessor 0 status register */ 
     u_int32_t tf_cause;  /* coprocessor 0 cause register */ 
     u_int32_t tf_lo; 
     ..... 
     u_int32_t tf_hi; 
     u_int32_t tf_ra;  /* Saved register 31 */ 
     u_int32_t tf_at;  /* Saved register 1 (AT) */ 
     u_int32_t tf_v0;  /* Saved register 2 (v0) */ 
     u_int32_t tf_v1;  /* etc. */ 
     u_int32_t tf_epc;  /* coprocessor 0 epc register */ 
}; 

void foo(void *tf, unsigned long as) { 
    struct trapframe *buf_tf = (struct trapframe *)tf; 
    ... } 

在函數foo,我沒有手動分配空間,而是直接用初始化一個trapframe結構參數的臨時trapframe結構指針buf_tf傳遞,我需要手動釋放buf_tf?C自然結構指針

+2

你的問題不是很清楚。 –

+0

請顯示您的代碼。你好像有混合結構指針和struct –

回答

0

所以,想必你碰到這樣的這個:

void myfunc (struct trapframe *p) 
{ 
    struct trapframe *tf_tmp = p; 

    ... 
} 

在這種情況下,內存分配在調用者,它是你正在訪問的調用者的結構。你無法解脫。你不知道它被分配到哪裏(堆或堆棧),並且調用者可能希望稍後訪問它。

或可能:

void myfunc (struct trapframe tf) 
{ 
    struct trapframe *tf_tmp = &tf; 

    ... 
} 

在這種情況下,該結構是通過複製傳遞和放置你的函數的本地堆棧(雖然實施細則有所不同)。當前功能退出時它將被釋放。

所以不,不要試圖釋放它。這樣做可能會破壞其他事情!對未在堆上分配的對象執行free可能會產生不良影響,它們是undefined

+0

是的,struct trapframe * tf應該被調用者函數使用,所以我不能通過buf_tf在函數foo中釋放tf。 –

0

1)不,如果你不需要釋放它,如果你沒有釋放trapframe struct argument passed in 2)是的,如果你有最終釋放trapframe struct argument passed in