c自由结构指针

c自由结构指针,c,pointers,struct,free,C,Pointers,Struct,Free,在函数foo中,我没有手动分配空间,而是使用传入的trapframe struct参数直接初始化临时trapframe struct指针buf\u tf,是否需要手动释放buf\u tf?1)不,如果不需要释放传入的trapframe struct参数,则不需要释放它 2) 是的,如果必须最终释放传入的trapframe struct参数,那么您大概有如下内容: struct trapframe { u_int32_t tf_vaddr; /* coprocessor 0 v

在函数foo中,我没有手动分配空间,而是使用传入的trapframe struct参数直接初始化临时trapframe struct指针buf\u tf,是否需要手动释放buf\u tf?

1)不,如果不需要释放传入的
trapframe struct参数,则不需要释放它

2) 是的,如果必须最终释放传入的
trapframe struct参数

,那么您大概有如下内容:

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; 
  ... }
在这种情况下,内存是在调用者中分配的,您正在访问的是调用者的结构。你没有资格释放它。您不知道它被分配到哪里(堆或堆栈),调用方可能希望稍后访问它

或者可能:

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

    ...
}
在这种情况下,结构通过副本传递,并放置在函数的本地堆栈上(尽管实现细节有所不同)。当当前函数退出时,它将被释放


所以不,不要试图释放它。这样做可能会破坏其他东西!对堆上未分配的对象执行
free
,可能会产生未定义的不良影响。

您的问题不太清楚。请显示您的代码。您似乎有混合的结构指针和struct somehowees,struct trapframe*tf应该由调用方函数使用,因此我无法通过函数foo中的buf_tf释放tf。
void myfunc (struct trapframe tf) 
{
    struct trapframe *tf_tmp = &tf;

    ...
}