簡體   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