我有以下问题。
首先,我有一个结构体
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; }; 然后我有两个方法--一个用于创建新的文件。
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);
}