我有以下问题:
首先我有结构:
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函数的值。如果这是可能的,我该怎么做?
谢谢你们!
const int id = 1;不是有效的 C,因为您不能像这样初始化结构的成员。通常,避免const成员的限定符,而是创建整个结构的实例const。uintptr_t newhandler()应该是uintptr_t newhandler(void),前者是过时的风格,不应该使用。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)