C 自由结构体指针

标签 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 结构体指针 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/

相关文章:

c - 连续声明的变量的内存地址顺序是否总是降序?

c - 通过将结构体的地址获取到其他类型的结构体的指针来获取临时[-fpermissive]的地址

c - 段错误(核心转储)...BMH 算法

c - linux上实现链表的C程序从文件读取数据出错

c++ - 在不同的文件中定义指针数组长度(C++)

c - 生成文件。用头文件创建程序

c++ - Windows 64 位结构大小随包含的数据类型而变化?

c - cygwin $'\r':找不到命令错误

c - GPA 计算器帮助 C

c++ - 使用引用指向节点的指针的函数删除链表中的节点?