2013-03-09 68 views
1

我有一個c程序,我試圖扭轉工程師ia32 assembly代碼。在一種方法中它似乎有(假定input_phrase是c串和ebp是一個指針)的線"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"。鑑於char是16位,它存儲char的空間應該與它存儲第二個int的空間重疊(並且通過測試,我發現這是這種情況)。對於這個代碼應該如何工作還是不可預測,有沒有精確的定義?sscanf如何處理重疊的指針?

+3

@nhahtdh甲'char'在C 1個字節,而不是8位。 – 2013-03-09 07:49:01

+0

@nhahtdh 1個字節(最小長度爲8位) – 2013-03-09 07:51:54

回答

2

實際問題的答案是「它不」 - 我不完全確定規範是否提到它,但我100%確定scanf沒有「哦,這與此重疊,所以我會做一些不同的事情「 - 你只是得到未定義的行爲。嘗試這樣的事情的結果是完全不可預測[它很可能只是導致無論是閱讀最後覆蓋不管它,第一讀重疊 - 但它也可能導致崩潰或第三次世界大戰爆發]

幸運的是,示出不調用該行爲,如在C char代碼被定義爲具有尺寸爲1,所以沒有衝突。

1

C標準計數以char爲單位的大小,所以char的大小是按照定義1.除非你在一些奇怪的硬件(信號處理器,pdp-10或類似的東西),這也將對應於一個正常的8位字節。由於你在x86架構上,你似乎錯誤地認爲變量是重疊的。

0

在x86,char將在大小爲8位(1個字節)。因此,在堆棧上,變量被佈局爲

CJJJJIIII 
     ^ebp 

其中I是int,C是字符和J是第二INT。沒有重疊。

+0

C中的char和byte都至少有8位。 C的'byte'不應該與普通的8位'byte',AKA ['octet'](http://en.wikipedia.org/wiki/Octet_%28computing%29)混淆。 – 2013-03-09 08:15:01

+0

是的,是的,它是特定於系統。儘管如此,我認爲每個x86處理器上的每個C編譯器都是如此,所以我調整了答案。 – nneonneo 2013-03-09 08:16:12