簡體   English   中英

如果我在 scanf 中傳遞變量值而不是變量引用會發生什么?

[英]What happens if I pass a variable value instead of a variable reference in scanf?

我有這個代碼:

int a;

scanf("%d", &a);

printf("You entered: %d", a);

這工作得很好,但我想知道如果我傳遞變量值而不是像scanf("%d", a)這樣的scanf中的變量引用會發生什么。

我沒有從編譯器得到錯誤,但也沒有 output 。 這里發生了什么?

在 scanf 中, "%d"期望一個指向int的指針,這意味着一個指向將存儲值的變量地址的指針,如果你傳遞a你將只是傳遞int沒有辦法存儲值,因為scanf贏了不知道在哪里。

這樣做將調用未定義的行為

基本上 & 是一個返回操作數地址的運算符。 如果你在 scanf 中給出不帶 & 的變量 a,它將按值傳遞給它,這意味着 scanf 將無法設置它的值供你查看。 通過引用傳遞它 - 使用 & 實際上傳遞一個指向 a 的指針 - 允許 scanf 設置它。

scanf期望與%d轉換說明符對應的參數是int object (類型為int * )的地址 a包含的任何都將被解釋為地址1

這樣做的行為是未定義的 - 編譯器不需要在翻譯期間發出診斷,並且運行時環境不需要拋出任何類型的異常。 根據a中包含的值,您可能會遇到運行時錯誤,或者您可能會破壞另一個數據 object,或者您的代碼可能會在沒有任何明顯錯誤的情況下運行,或者可能會發生完全不同的事情。


  1. 至少在sizeof (int) == sizeof (int *)的系統上 - 對於像 x86_64 這樣的系統,情況並非如此,因此scanf會將a之外的字節視為地址的一部分。

暫無
暫無

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

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