gpt4 book ai didi

c++ - void* 和 *(void**) 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:31 30 4
gpt4 key购买 nike

我正在用 C++ 编写一个 aligned_malloc 实现,主要使用以下代码,这些代码可以在 Interwebs 的各个地方找到,包括 SO:

void * aligned_malloc(size_t size, int align) {
if (align < 0) {
return NULL;
}

void *ptr;
void *p = malloc(size + align - 1 + sizeof(void*));

if (p != NULL) {
ptr = (void*) (((ptrdiff_t)p + sizeof(void*) + align -1) & ~(align-1));
*((void**)((ptrdiff_t)ptr - sizeof(void*))) = p;
return ptr;
}
return NULL;
}

void aligned_free(void *p) {
void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
free(ptr);
return;
}

我在 aligned_malloc 中得到了 *(void**)。我对 aligned_free 中的转换有误解。既然我们只想要值而不必分配给它为什么不使用

void *ptr = ((void*)((ptrdiff_t)p - sizeof(void*)));

代替

void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));

我认为它是一样的,但是当我尝试第一个对齐方式为 64 时,它给了我一个错误,但是当我尝试第二个转换时,程序运行正常。那么两者有什么区别呢?为了可读性,我省略了正确的 C++ 转换。

最佳答案

让我们简化代码:

int x = 7;
void * p = &x;
void * q = &p;

现在让我们画一个图:

  +---+
x | 7 |
+---+
^
|
+-|-+
p | * |
+---+
^
|
+-|-+
q | * |
+---+

你看到 pq 不相等了吗?如果你有 q,并且你想到达 p,你必须取消引用 q。但是由于 void* 不能被取消引用,你必须向类型系统保证它会在取消引用之后找到另一个指针,因此在取消引用之前转换为 void** .

assert(q != p);
assert(*(void**)q == p);

关于c++ - void* 和 *(void**) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23990140/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com