[英]why do we need to use (void*)&a instead of &a
int main()
{
int a;
int* b;
a = 40;
b = &a;
printf("the address of a is %p, and the value of a is %d \n",&a, a);
return 0;
}
我發現兩者(void*)&a
和&a
打印相同的東西。 那么為什么人們仍然添加(void*)
? 這只是一種習慣嗎?
使用說明符%p
打印存儲在指針中的地址,此格式說明符要求類型為void *
。 並且因為&a
是int *
類型,所以使用了cast void *
。
printf()
格式說明符%p
需要void*
類型指針。 由於您傳遞的內容可能不是void*
類型指針,並且標准並未要求所有指針具有相同的格式,因此在將指針傳遞給printf之前將其轉換為void*
非常重要。
例如:
int* a = malloc(sizeof(int));
printf("a is %p",(void*)a);
作為最佳實踐,incase int*
和void*
不相似
首先,不同的指針類型不一定是可互換的。
其次,對於varargs,由於編譯器不知道期望的類型,因此不會發生隱式轉換。
C Standard表示在printf中使用不正確的說明符將導致未定義的行為。
7.21.6.1 fprintf函數
- 如果轉換規范無效,則行為未定義。 282)如果任何參數不是相應轉換規范的正確類型,則行為未定義。
因為指向int的指針與 指向void的指針的類型不同,並且%p
只能用於指向void的指針 ,即使其他一些規則指出任何指針都可以轉換為指向void和back的指針 ,那么由於引用的規則,更改了行為未定義的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.