释放uintptr_t指向的内存。

问题描述 投票:0回答:1

我有以下问题。

首先,我有一个结构体

struct Filehandler
{
    const int id = 1;
};

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

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

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;
}

我知道这看起来有些混乱,但我必须检索指针所指向的地址作为值。这就是为什么我把指针作为值返回的原因。

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

void destroy_handler(uintptr_t ptr) {
    ........?
}

因此,我的问题是:是否可以删除Structor filehandler如果我把指向它的指针存储在了一个 uintptr_t 并把它作为一个值给 destroy_handler 的功能。如果可以的话,我该怎么做呢?

谢谢你们!我有以下问题:首先,我有一个struct: struct Filehandler { const int id = 1; }; 然后我有两个方法--一个用于创建新的文件。

c pointers memory
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.