簡體   English   中英

為什么我們需要使用(void *)&a而不是&a

[英]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 * 並且因為&aint *類型,所以使用了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函數

  1. 如果轉換規范無效,則行為未定義。 282)如果任何參數不是相應轉換規范的正確類型,則行為未定義。

因為指向int的指針與 指向void的指針的類型不同,並且%p只能用於指向void指針 ,即使其他一些規則指出任何指針都可以轉換為指向void和back的指針 ,那么由於引用的規則,更改了行為未定義的事實。

暫無
暫無

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

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