簡體   English   中英

為什么有從 char** 轉換為 void** 的警告,而不是從 char* 轉換為 void* 的警告?

[英]Why is there a warning for casting from char** to void**, but not from char* to void*?

我對 C 很陌生,並且一直在練習指針。 我知道void *指針接受任何類型的指針,所以這很好用:

void functionWithSingleVoidPointer(void *simplePointer)
{
    free(simplePointer);
}
int main()
{
    char *simplePointer = malloc(sizeof *simplePointer);
    functionWithSingleVoidPointer(simplePointer); //No warnings
    return 0;
}

但是,我不明白為什么會這樣:

void functionWithDoubleVoidPointer(void **doublePointer)
{
    free(*doublePointer);
}
int main()
{
    char *simplePointer = malloc(sizeof *simplePointer);
    char **doublePointer = &simplePointer;
    functionWithDoubleVoidPointer(doublePointer);
}

給我一個警告:

警告:從不兼容的指針類型 [-Wincompatible-pointer-types] 傳遞 'functionWithDoubleVoidPointer' 的參數 1...注意:預期的 'void **' 但參數的類型為 'char **'

為什么從char *void *的轉換沒有給出任何警告,但從char **void **的轉換卻可以?

一個char*值指向一個char object; 一個void* object 可以指向任何類型的 object。 轉換是安全的(只要您不對結果做任何不安全的事情)。

char**指針值必須指向 memory 某處的char*類型的指針 object。 void**指針值必須指向void*類型的 object。 由於char*void*是不同的類型,您不能只假設您可以安全地對待一種類型的 object 就好像它是另一種類型的 object。 (很可能它們具有相同的表示形式,但語言並不能保證這一點。)

一個void**不是一個void 指針,就是這樣。
void**一個指向 void 指針的指針,它只接受 void 指針。

暫無
暫無

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

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