[英]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.