printf函式沒有注意到的知識點

2021-06-27 22:10:43 字數 1135 閱讀 9149

在論壇上看到了同事發表的關於printf函式的疑問,本來想著自己幫解惑呢,結果發現自己也是百思不得其解。罷了,既然自己想不明白,就乖乖敲幾行**分析分析吧。

struct son;

struct parent;

int main{

struct parent papa;

papa.d =1; 

papa.f = 5;  

papa.e.a =2; 

papa.e.b = 3; 

papa.e.c=4; 

int a = 3;

int test1 = 1;

printf("%x,%x,%x,%x\n",papa,&papa,a,test1);

實際的輸出結果:1,2,3,4 和預期不符

觀察printf函式定義後,發現會把不定引數先輸入變數arglist,此時arglist的位址為0x0012fdbc

檢視此時的記憶體內容:

0x0012fdb0       

30 ff 12 00                 59 15 41 00        

8c 56 41 00               01 00 00 00

02 00 00 00               03 00 00 00

04 00 00 00               05 00 00 00 

18 ff 12 00                  03 00 00 00

01 00 00 00

分別是01, 02, 03, 04, 05,對應的是papa結構體的成員值。後面的18 ff 12 00才是papa變數的位址,03是a的值,01是test1的值,可以發現他們在arglist中的偏移量分別是0x14,0x18,0x1c

函式中的format為四個四位元組的資料,偏移量分別是0x0,0x4,0x8,0xc,所以讀出來的值就和預期的值有區別了。

要想得到正確的值,可以把這些值分開列印,每個變數用乙個printf列印或者可以這樣實現:printf("%x,%x,%x,%x,%x,%x,%x,%x\n",papa,&papa,a,test1)。

此處還有一點是平時沒有注意到的,就是結構體做變數傳入的時候是把所有的成員值全部傳了進去,和陣列名是不一樣的,陣列名做引數就是位址。

以前沒有注意到的乙個題目

以前看string的時候還真沒有注意到,還是容易混淆的 string s1 m string s2 n string s3 s1 s2 string s4 s1 s2 system.out.println s3 s4 final string s1 m final string s2 n strin...

shell指令碼要注意到的問題

1.指定bash shell 指令碼的第一行,之後應該是什麼?如果拿這個問題去問別人,不同的人的回答可能各不相同。我見過 usr bin env bash,也見過 bin bash,還有 usr bin bash,還有 bin sh,還有 usr bin env sh。這算是程式設計界的 茴 字四種...

人們不會注意到軟體的內部變化

有些人會經常向我抱怨 為什麼這麼多年過去了,計算器和記事本這兩個小工具一點變化都沒有?實際上,它們確實改變了,只是你沒有注意到而已。如果你觀察下你的記事本程式,你會發現它多了一些額外的選單。還有計算器這個程式也經歷過很多次 大修 對於下面的使用者反饋,我通常不會感到意外 微軟為什麼要花很多時間使wi...