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 *在这段代码中返回?
答案 0 :(得分:6)
任何类型的指针都可以隐式转换为void *
,包括指向void *
的指针,即void **
。
答案 1 :(得分:5)
void*
可以指向任何,包括另一个指针。
答案 2 :(得分:3)
此代码中
void**
等同于void *
的返回方式是什么?
任何指针类型都可以转换为void*
。
不应该返回p2 [0],因为它返回void **
没有。 p2
是对齐内存的地址,因此函数应该返回。在函数内,它被重新解释为void**
,以便在对齐的内存之前存储原始地址;据推测,这可以通过释放内存的相应函数来回读。在函数之外,它不会被解释为指向任何特定类型 - 由调用者决定使用对齐内存的内容。
答案 3 :(得分:2)
你可以退货。但我怀疑它是否按预期工作。
至少,你不能简单地free()
它;你必须有一个单独的功能。
然而,它会起作用。