2015-07-03 62 views
1
#include <stdio.h> 

int main() 
{ 
    int val; 

    printf("blah%p%nblah", &val, &val); 

    printf("val = %d\n", val); 

    return 0; 

} 

該演示程序在32位機器上編譯。我認爲val應該是8 但我得到這個:printf%n如何計算字符?

$ ./a.out 
blah0xffa9b6fcblahval = 14 

爲什麼14? blah是4個字符。 IA32中的指針應該是4個字節。 %n什麼都不打印。

+1

關閉這個重複的代碼似乎是從該答案中獲得的,而這個答案已經回答了這個問題。 – Lundin

回答

3

請計數的印刷字符的數目,它們是14

存儲在變量int指針的值的"%n"說明符字符的數目印刷"%n"指定符的occurrance之前poitner地址有10個,blah有4個。

blah0xffa9b6fc /* these are exactly 14 characters 
^ ^
    %s  %p 
*/ 
0

該輸出串(前會遇到格式說明%N)

blah0xffa9b6fc 

正好包含14個符號。原因VAL包含14是十六進制碼

0xffa9b6fc 
在你的平臺上指針

事實上格式說明%p輸出地址有4個字節大小。:)

3

只是爲了支持一下Mr. Iharobhis answer說,

C11報價,章§7.21.6.1,fprintf()(重點煤礦)

n

的參數應該是一個指針,指向符號整數寫入的 數由該呼叫到目前爲止寫入到輸出流以 fprintf中的字符到其中。沒有參數被轉換,但一個被消耗。如果規範轉換 包含任何標誌,字段寬度或精度,則行爲爲 未定義。

所以,格式字符串,相反,實際印刷字節數字節。

也就是說,推薦的簽名main()int main(void)