簡體   English   中英

如果我為 int 指針分配一個浮點變量地址會發生什么,反之亦然?

[英]What happens if I assign to an int pointer a float variable address and vice-versa?

我想知道如果我給一個int指針一個float變量地址會發生什么,反之亦然,所以我嘗試了它,但無法完全理解發生了什么,所以如果有人能解釋我會很感激。

int n = 5;
float f = 1.21;
float *pf = &n;
int *pn = &f;

printf("%p  %p\n", pn, pf);
printf("%p  %p\n", &f, &n);
printf("%d   %f \n", *pn, *pf);
printf("%f   %d \n", n, f);
printf("%d  %f \n", n, f);

輸出:

0xffffcba8  0xffffcbac
0xffffcba8  0xffffcbac
1067114824   0.000000
0.000000   0
5  1.210000

您的代碼中有許多未定義行為的實例:

  • int n = 5; : 好的
  • float f = 1.21; : 好的
  • float *pf = &n; 用指向不同類型的指針的值初始化一個指針。 C 標准不保證這會做什么,也不保證當你取消引用這個指針時會發生什么。 使用-Wall -W ,您肯定會收到警告,您可以通過-Wall -W使其靜音: float *pf = (float *)&n; ,但結果是相同的,取消引用指針具有未定義的行為。
  • int *pn = &f; 和上面一樣。
  • printf("%p %p\\n", pn, pf); -> 你應該將指針轉換為(void *)因為%p需要一個void *作為參數。 在一些罕見的系統(舊的 Cray 系統 IIRC)上,指向intfloatvoid指針可能有不同的表示,導致對printf調用以意想不到的方式運行。 改用這個:

     printf("%p %p\\n", (void *)pn, (void *)pf);
  • printf("%p %p\\n", &f, &n); -> 同樣的問題。 改用這個:

     printf("%p %p\\n", (void *)&f, (void *)&n);

    兩個表達式的輸出是正確的並且相同,因為您的系統是常規的,但 C 標准不保證它。

  • printf("%d %f \\n", *pn, *pf); 這是正確的,但取消引用指針具有未定義的行為。
  • printf("%f %d \\n", n, f); 傳遞與預期類型不同的類型值具有未定義的行為。 你得到的輸出是不正確的。
  • printf("%d %f \\n", n, f); 這個是正確的,輸出是5 1.210000正如預期的那樣。

Chqrlie的回答比我的好得多。 請重新接受他的回答。


你不應該濫用指針和對象——即使不是出於好奇的原因。 1., 2., 5. printf命令的結果是正確的,而3., 4. printf命令的結果是Undefined Behavior的產物,沒有人可以解釋。

有關未定義行為的更多信息: 未定義、未指定和實現定義的行為

暫無
暫無

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

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