C++ 作废**等同于作废*退货?

C++ 作废**等同于作废*退货?,c++,c,C++,C,请帮助我理解这个修改过的malloc,void**在代码中如何等效于void*return?Avoid*可以指向任何东西,包括另一个指针。任何类型的指针都可以隐式转换为void*,包括指向void*的指针,akavoid**您可以将其返回。但我怀疑它是否如预期的那样起作用 至少,你不能简单地free()it;你必须有一个单独的功能 然而,到那时,它就会起作用 在该代码中,void**如何等同于void*返回 任何指针类型都可以转换为void* 返回值不应该是p2[0],因为它返回的是void**

请帮助我理解这个修改过的malloc,void**在代码中如何等效于void*return?

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

任何类型的指针都可以隐式转换为
void*
,包括指向
void*
的指针,aka
void**

您可以将其返回。但我怀疑它是否如预期的那样起作用

至少,你不能简单地
free()
it;你必须有一个单独的功能

然而,到那时,它就会起作用

在该代码中,
void**
如何等同于
void*
返回

任何指针类型都可以转换为
void*

返回值不应该是p2[0],因为它返回的是void**


否。
p2
是对齐内存的地址,因此函数应该返回该地址。在函数中,它被重新解释为
void**
,以便在对齐的内存之前存储原始地址;据推测,这是由释放内存的相应函数读回的。在函数之外,它不会被解释为指向任何特定的类型,而是由调用者决定如何使用对齐内存。

只需检查
printf(“%d=?%d\d”、sizeof(some_ptr__ptr)、sizeof(*some_ptr_ptr_ptr))相当于
sizeof(void**)
sizeof(void*)
,因为
void*
&朋友是为寻求危险的人准备的。如果使用指向…的指针,你真的应该知道你在做什么<代码>无效
。由于这里的隐式类型转换,您失去了编译器类型检查的华丽。或者更确切地说,没有编译器错误的原因是因为
void*
可以转换为任何其他指针类型,而无需显式转换。非常感谢大家,我现在明白隐式转换确实混淆了清晰的代码
    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**

}