2011-04-25 109 views
1

我正在使用Simple Scalar工具集在緩存關聯性上運行一些模擬。而且我正在用printf函數看到一些最奇怪的行爲。這裏是代碼片段:命令printf出現奇怪的問題

printf(" Name: %s %d %d %d \n", name, nsets, cp->set_shift, cp->set_mask); 
printf(" Name: %s %d %d %d \n", name, cp->set_mask, nsets, cp->set_shift); 

的printf的線是一個接着一個,中間沒有其它代碼。這裏是輸出:

Name: dl1 128 5 127 
Name: dl1 127 0 128 

第二個printf的輸出是錯誤的。第二個printf的輸出應爲:

Name: dl1 127 128 5 

更改printf語句的相對順序不會更改輸出。我錯過了什麼printf的部分?

至於 新手

+2

這四個參數的類型是什麼? – 2011-04-25 05:12:27

回答

7

去看看變量聲明。我的猜測是有人是shortlong,而不是int。由於printf無法檢查您傳遞的有效性,因此它會根據%符號決定從堆棧中抓取多少個叮咬。如果你的參數不符合格式,不是編譯錯誤,但垃圾可以出來。

+1

現在在大多數系統中'sizeof(int)== sizeof(long)',因爲OP說''set_mask'是'long long'。 – 2011-04-25 05:41:24

3

我想你會在你傳遞的類型和你正在告訴打印的類型之間出現錯誤匹配。具體來說,它看起來像cp-> set_mask是比int大一些的類型。既然你已經告訴printf它是一個int,它將第一個sizeof(int)字節作爲第一個int,然後將下一個sizeof(int)字節看作nsets(因爲你明顯處於一個小小的狀態) endian機器,那些字節都包含0)。注意,特別是之後的的0來的第一個打印的128是nsets的值。

+0

哦,你們很棒。我會永遠不會發現! set_mask實際上是long long int。我只是將%d更改爲%lld,並修復了這一問題。謝謝!!! – Richeek 2011-04-25 05:25:30