释放 uintptr_t 指向的内存

Sam*_*sel 0 c memory pointers

我有以下问题:

首先我有结构:

struct Filehandler
{
    const int id = 1;
};
Run Code Online (Sandbox Code Playgroud)

然后我有两种方法 - 一种用于创建新的 Filehandler 结构,另一种用于删除该结构。因为整个代码是 Rust 项目的 Webassembly 插件的一部分,所以我必须使用指针。

所以这是我分配结构的方法:

uintptr_t newhandler() {

    struct Filehandler* filehandler = (struct Filehandler*) malloc(sizeof(struct Filehandler));
    uintptr_t *ptr = (uintptr_t *)&filehandler;
    uintptr_t temp = (uintptr_t)ptr;
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

我知道这在某种程度上看起来令人困惑,但我必须检索指针指向的地址作为值。这就是为什么我将我的指针作为值返回。

现在我想创建一个删除结构的函数。作为参数,函数得到一个uintptr_t

void destroy_handler(uintptr_t ptr) {
    ........?
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否可以删除 Struct filehandler,如果我有一个指向它的指针存储在 a 中uintptr_t,并将其作为destroy_handler函数的值。如果这是可能的,我该怎么做?

谢谢你们!

Lun*_*din 5

  • const int id = 1;不是有效的 C,因为您不能像这样初始化结构的成员。通常,避免const成员的限定符,而是创建整个结构的实例const
  • uintptr_t newhandler()应该是uintptr_t newhandler(void),前者是过时的风格,不应该使用。
  • 强制转换 malloc 的结果是没有意义的。考虑一下struct Filehandler* filehandler = malloc (sizeof *filehandler);
  • uintptr_t *ptr = (uintptr_t *)&filehandler;没有任何意义,您正在转换 malloc:ed指针的地址,它是一个局部变量。放下&.
  • uintptr_t temp = (uintptr_t)ptr; 没有任何意义,因为您再次投射本地指针的地址。

固定代码应该类似于:

struct Filehandler
{
    int id;
};

const struct Filehandler FH = {.id = 1};

...

#include <stdlib.h>

uintptr_t newhandler (void) 
{
  struct Filehandler* filehandler = malloc(sizeof *filehandler);
  if(filehandler == NULL)
  {
    return 0;
  }

  // optional line: memcpy(filehandler, &FH, sizeof FH);

  return (uintptr_t)filehandler;
}


void destroy_handler(uintptr_t ptr) 
{
  free((void*)ptr);
}
Run Code Online (Sandbox Code Playgroud)