void*和*(void**)之间有什么区别? 我在C++中编写了AligNedMaLoC/实现,主要使用以下代码,可以在不同的位置找到,包括: 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; }

void*和*(void**)之间有什么区别? 我在C++中编写了AligNedMaLoC/实现,主要使用以下代码,可以在不同的位置找到,包括: 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; },c++,pointers,C++,Pointers,而不是 void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*))); 我认为这是一样的,但当我尝试第一个与64对齐,它给了我一个错误,但当我尝试第二个演员的程序工作正常。那么这两者的区别是什么呢?为了便于阅读,我省去了适当的C++版本。如果替换, 应该更清楚。 void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*))); 同等的 void *ptr = ((void**)((ptrdiff_t)p

而不是

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

我认为这是一样的,但当我尝试第一个与64对齐,它给了我一个错误,但当我尝试第二个演员的程序工作正常。那么这两者的区别是什么呢?为了便于阅读,我省去了适当的C++版本。如果替换

应该更清楚。
void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
同等的

void *ptr = ((void**)((ptrdiff_t)p - sizeof(void*))) [0];
*不是任何强制转换的一部分,它是取消对指针的引用。它正在从内存中读取数据


另一方面,你应该得到一本关于C++的很好的书,并看看C++库中的函数。这更有可能在没有问题的情况下工作。使用malloc_aligned意味着您有两类指针,一类是由malloc分配的,另一类是由malloc_aligned分配的,两者都不兼容

让我们简化代码:

int x = 7;
void * p = &x;
void * q = &p;
现在让我们画一张图表:

  +---+
x | 7 |
  +---+
    ^ 
    |
  +-|-+
p | * |
  +---+
    ^ 
    |
  +-|-+
q | * |
  +---+
你知道
p
q
是如何不相等的吗?如果你有
q
,你想进入
p
,你必须取消对
q
的引用。但是,由于无法取消引用
void*
,因此必须向类型系统保证,它将在取消引用后找到另一个指针,因此在取消引用之前强制转换为
void**

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

因为它们不是一回事。第二个涉及到解引用,即它读取存储在内存中的值。请解释一下好吗?我将更新我的帖子,介绍我对这两个方面的理解。
运算符new
有什么问题,它提供了对齐存储,C++11§18.6.1/2“将非空指针返回到适当对齐的存储”。@DavidBos指针代数涉及规则
*&a=&a=a
。没有规定,
*(T*)a=a
。哦,妈的。。。我对函数有一种奇怪的想法。我认为
(ptrdiff_t)p-sizeof(void*)
上的地址始终是
malloc
返回的地址,这显然是不正确的。很抱歉,给您带来不便,感谢您更新内容,我想我会删除这篇文章,因为它已经没有任何用途了。是的,我刚收到。我脑子里的功能是错误的。我认为
malloc
返回的地址总是等于
(ptrdiff_t)p-sizeof(void*)
,这引起了我的混淆。不过我现在明白了。谢谢我接受了你的回答,但最初的问题更多地依赖于我的错误,而不是指针。我应该继续问这个问题吗?
assert(q != p);
assert(*(void**)q == p);