c免费结构指针

时间:2013-04-14 13:22:35

标签: c pointers struct free

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 struct参数初始化临时陷阱结构指针buf_tf,我是否需要手动释放buf_tf?

2 个答案:

答案 0 :(得分:0)

1)不,如果您不需要免费提供trapframe struct argument passed in 2)是的,如果你必须最终释放trapframe struct argument passed in

答案 1 :(得分:0)

所以,大概你有这样的事情:

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

    ...
}

在这种情况下,内存在调用者中分配,它是您正在访问的调用者的结构。你无法释放它。您不知道它的分配位置(堆或堆栈),调用者可能希望以后访问它。

或者也许:

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

    ...
}

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

所以不,不要试图释放它。这样做可能会打破其他事情!对未在堆上分配的对象执行free可能会产生 undefined 的错误效果。