如何在不进行强制类型转换的情况下取消引用void变量

3
typedef void *STACK_ENTRY;

STACK_ENTRY *create_stack_entry(void *value) {
    STACK_ENTRY *entry = malloc(sizeof(*value));
    *entry = *value;
    return entry;
}

我试图创建一个通用函数来创建一个STACK_ENTRY,使其能够拥有任何类型。因此,我使用了一个void指针作为参数。我分配了与该值类型大小相同的内存,然后我想将该值赋给STACK_ENTRY的指针。但是,我遇到了以下错误:
prog.c:34:9: error: void value not ignored as it ought to be
  *entry = *value;
         ^

我该怎样解决这个问题?

1
编译器如何知道您取消引用的空指针的大小? - bruceg
@bruceg 所以没有办法拥有这样的方法吗?我总是需要知道值的类型吗? - yemerra
2
“我该如何修复这个错误呢?”将指针转换为 STACK_ENTRY *, 然后对这个非空指针进行解引用。 - chux - Reinstate Monica
我总是需要知道值的类型,而不需要知道值的地址和类型的大小。也许发布create_stack_entry()的样例用法可以澄清你的需求。 - chux - Reinstate Monica
1
你不应该使用 sizeof(*value),而应该使用 sizeof(*entry)。因为 void 类型的 sizeof 是未定义的,在 GCC 扩展中是 1。 - user3528438
显示剩余6条评论
1个回答

4

代码需要考虑大小。调用create_stack_entry()时传入大小即可,无需进行强制转换。

 // STACK_ENTRY *create_stack_entry(void *value)
 STACK_ENTRY *create_stack_entry(void *value, size_t size) {
   STACK_ENTRY *entry = malloc(size);
   if (entry) memcpy(entry, value, size);
   return entry;
 }

我猜OP真的想要的是 STACK_ENTRY create_stack_entry(void *value, size_t size);。栈本身是一个动态数组。每个元素都是指向实际数据的 void *,因此 create 函数应该创建这样的 void * - user3528438
可能是的。我怀疑OP的目标正在发展。需要看到OP对create_stack_entry()的样本使用及其最终的释放策略。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接