void **等同于void *返回值吗?

5
    void * alligned_malloc(size_t bytes , uint16_t allign)
{

    uint16_t offset = allign - 1 + sizeof(void*);

    void* p1 = malloc(offset + bytes);
    void**p2 = (void**)(((size_t)p1+offset) & ~(allign - 1));
    p2[-1] = p1;

    return p2; // Why is this correct ? should not the return be p2[0] as it is     returning void**

}

请帮我理解这个修改后的malloc函数,为什么在这段代码中void**等同于void*返回值?

只需检查 printf("%d =? %d\d", sizeof(some_ptr_to_ptr), sizeof(*some_ptr_to_ptr));,它等同于 sizeof(void **)sizeof(void *) - Elias Van Ootegem
1
由于void*等类型是为了寻求危险的人而设计的,如果使用指向指针的指针等类型,则确实应该知道自己在做什么。由于存在隐式类型转换,您将失去编译器类型检查的便利性。 - alk
4个回答

6
任何类型的指针都可以隐式转换为 void *,包括指向 void * 的指针,也就是 void ** 指针。

非常感谢大家,我现在明白了隐式转换确实会使清晰的代码变得混乱。 - ashok v

5
一个 void* 可以指向 任何 东西,包括另一个指针。

1
实际上,没有编译器错误的原因是void*可以在没有显式转换的情况下转换为任何其他指针类型。 - Lundin

3
在这段代码中,为什么void**等价于void*返回值?
任何指针类型都可以转换为void*
那么返回值不应该是p2[0]吗?因为它返回的是void**
不是的。p2是对齐内存的地址,所以函数应该返回它。在函数内部,它被重新解释为void**以便存储原始地址,这个地址可能会被相应的释放内存的函数读回。在函数外部,它不被解释为指向任何特定类型的指针——由调用者决定如何使用对齐内存。

2
你可以返回它。但我怀疑它能否达到预期的效果。
至少,你不能简单地使用free()函数释放它;你必须有一个单独的函数来执行这一操作。
然后,它就可以正常工作了。

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