[英]Why the following code gives this output?
我正在調整printf()
函數。由於printf()
函數采用格式說明符,以便識別要打印的數據類型(如果我錯了,請糾正我)作為參數傳遞給它的數據類型的值,所以我試圖做這樣的事情
#include<stdio.h>
int main()
{
char *f="%d";
char *g="asd";
printf(f,g);
return 0;
}
而o / p是-
4210739
我不明白為什么o / p是數字?
因為,您的代碼調用了undefined behavior 。
您正在嘗試使用%d
格式說明符打印字符串 。 您應該改用%s
格式說明符。 為特定格式(轉換)說明符使用錯誤的參數類型將調用UB。
引用C11
,第§7.21.6.1章
[...]如果任何參數不是對應轉換規范的正確類型,則行為未定義。
更改
char *f="%d";
至
char *f="%s";
如前所述, %d
說明符指定您將傳遞一個整數作為第二個參數,並傳遞一個指針( *char
類型)變量。 因此, printf()
例程將指針解釋為整數,並按此方式打印指針(實際上是它的值)。
要正確輸出字符串,您應該使用%s
說明符。
你說,
由於printf()函數采用格式說明符以便識別要打印的數據類型(如果我輸入錯誤,請更正我)
我不確定,但是我認為您在這里可能有點不對。
你打電話時
printf(f, g);
要理解的關鍵是, printf
無法知道g
的類型 。
調用printf
, 您的工作是確保對於在格式字符串中使用的每個格式說明符(即每個%
thingie),傳遞正確類型的參數。 對於格式字符串中的每個%d
,必須傳遞一個int
。 對於格式字符串中的每個%f
,必須傳遞double
。 對於格式字符串中的每個%s
,必須傳遞一個char *
指向有效字符串。 等等。
在您的代碼中,格式字符串中有%d
,但是您沒有傳遞int
,而是傳遞了char *
指向字符串。 因此,您無法獲得預期的結果。
%d
想要一個int
,但是您沒有給它一個。 您傳遞了一個char *
,但是printf
不知道該如何處理。 (如果您使用了%s
,則printf
將知道如何處理char *
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.