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 结构体指针 buf_tf,并传入一个 trapframe 结构体参数,是否需要手动释放 buf_tf?
最佳答案
所以,大概你有这样的东西:
void myfunc (struct trapframe *p)
{
struct trapframe *tf_tmp = p;
...
}
在这种情况下,内存是在调用者中分配的,它是您正在访问的调用者的结构。你没有能力释放它。您不知道它被分配在哪里(堆或堆栈),调用者可能希望稍后访问它。
或者也许:
void myfunc (struct trapframe tf)
{
struct trapframe *tf_tmp = &tf;
...
}
在这种情况下,结构体通过副本传递并放置在函数的本地堆栈上(尽管实现细节有所不同)。当当前函数退出时它将被释放。
所以不,不要尝试释放它。这样做很可能会破坏其他东西!对未在堆上分配的对象执行free
可能会产生未定义的不良影响。
关于C 自由结构体指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15999534/