簡體   English   中英

C:為什么&(void *)和void **不兼容?

[英]C: Why aren't &(void *) and void** compatible?

雖然我的代碼正常運行,但我收到了一個不兼容的指針類型錯誤警告。 首先,這是我的代碼的簡化版本:

typedef struct {
    int field1;
    int field2;
} my_struct;

void some_function(void **data){
    // do something with *data
}

int main(int argc, char *argv[]){
    my_struct *ptr = malloc(sizeof(my_struct));
    ptr->field1 = 5;
    ptr->field2 = 17;
    some_function(&ptr);
}

my_struct類型是一個示例,但我實際上使用了多個類型,因此some_func必須接受void** ,而不是my_struct** 每次我以上述方式調用some_func時,都會收到以下警告,但我的代碼功能正常。

warning: passing argument 1 of ‘my_func’ from incompatible pointer type

我不確定為什么這些類型不兼容,並希望以某種方式刪除警告。 要獲得答案,請隨時解釋為什么會發生這種情況,如果可能的話,如何刪除警告(可能是cpp指令?)。 謝謝!

使用void *參數類型。

void **不是通用指針類型。 void *是。

void*表示(有效地)“指向無類型內存區域的指針”。

void**表示(有效地)“指向內存區域的指針,其中包含指向無類型內存區域的指針”。

注意中間的塊有一個類型 - 一個void*數組。 你有效地傳遞了一個mystruct*數組,這是一個不同的類型。 所以你的編譯器警告你。

嘗試將Derived**轉換為Base**時,C ++中也會出現類似的問題 但它也適用於C語言。 void*操作類似於所有指針類型的“基類”)考慮一段這樣的代碼:

void does_things(void** outParameter)
{
    *outParameter = malloc(42); // Looks fine; writing void* to void* :)
}

int main()
{
    my_struct* x = /*...*/;
    does_things(&myStruct); // Ut oh, tries to make x point to
                            // something that is *not* a my_struct
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM