繁体   English   中英

void *和*(void **)之间有什么区别?

[英]What is the difference between a void* and *(void**)?

我在C ++中编写了一个aligned_malloc实现,主要使用下面的代码,可以在aligned_malloc各个地方找到,包括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);

如果更换,应该更清楚

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

与等价物

void *ptr = ((void**)((ptrdiff_t)p - sizeof(void*))) [0];

*不是任何强制转换的一部分,它取消引用指针。 它正在从内存中读取数据。

另一方面,您应该获得一本关于C ++的非常好的书,并查看C ++库中内置的函数。 这更有可能没有问题。 使用malloc_aligned意味着你有两类指针,malloc分配的指针和malloc_aligned分配的指针,两者都是不兼容的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM