我有一個c
程序,我試圖扭轉工程師ia32 assembly
代碼。在一種方法中它似乎有(假定input_phrase是c
串和ebp
是一個指針)的線"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"
。鑑於char是16位,它存儲char的空間應該與它存儲第二個int的空間重疊(並且通過測試,我發現這是這種情況)。對於這個代碼應該如何工作還是不可預測,有沒有精確的定義?sscanf如何處理重疊的指針?
回答
實際問題的答案是「它不」 - 我不完全確定規範是否提到它,但我100%確定scanf
沒有「哦,這與此重疊,所以我會做一些不同的事情「 - 你只是得到未定義的行爲。嘗試這樣的事情的結果是完全不可預測[它很可能只是導致無論是閱讀最後覆蓋不管它,第一讀重疊 - 但它也可能導致崩潰或第三次世界大戰爆發]
幸運的是,示出不調用該行爲,如在C char
代碼被定義爲具有尺寸爲1,所以沒有衝突。
C標準計數以char爲單位的大小,所以char的大小是按照定義1.除非你在一些奇怪的硬件(信號處理器,pdp-10或類似的東西),這也將對應於一個正常的8位字節。由於你在x86架構上,你似乎錯誤地認爲變量是重疊的。
在x86,char
將在大小爲8位(1個字節)。因此,在堆棧上,變量被佈局爲
CJJJJIIII
^ebp
其中I
是int,C
是字符和J
是第二INT。沒有重疊。
C中的char和byte都至少有8位。 C的'byte'不應該與普通的8位'byte',AKA ['octet'](http://en.wikipedia.org/wiki/Octet_%28computing%29)混淆。 – 2013-03-09 08:15:01
是的,是的,它是特定於系統。儘管如此,我認爲每個x86處理器上的每個C編譯器都是如此,所以我調整了答案。 – nneonneo 2013-03-09 08:16:12
- 1. sscanf中的字符指針()
- 2. 妥善處理指針的指針
- 3. 如何處理互相重疊的iBeacon
- 4. C++指針處理
- 5. 如何在處理基類的多重指針時同時處理多態性?
- 6. 如何處理數組指針?
- 7. 如何使用指針處理地圖?
- 8. 如何處理空指針異常?
- 9. 我的指針將如何處理在C++和Windows中處理?
- 10. html如何處理重疊標籤?
- 11. 如何處理Base *指針作爲Derived <T> *指針?
- 12. 如何處理弱指針和強指針?
- 13. 處理realloc中的指針?
- 14. 處理重疊的MKAnnotationView
- 15. OpenCV指向位圖處理的指針
- 16. 處理空指針異常
- 17. 處理函數和指針
- 18. 空指針exeception處理
- 19. 處理指針數組
- 20. 處理2d數組指針
- 21. sscanf指針vs變量地址
- 22. 如何在重新分配指針時處理手動內存管理?
- 23. 處理refrence的指針/使用SWIG [C++到Java]雙指針
- 24. 使用指針的指針爲浮點[3]與sscanf的,得到一個例外
- 25. c#處理像指針的數組
- 26. 無效的指針處理策略
- 27. 的Java:對象指針處理
- 28. 共享指針的處理是什麼?
- 29. 處理C++中的指針和向量
- 30. 處理C的空終止指針(ffi)
@nhahtdh甲'char'在C 1個字節,而不是8位。 – 2013-03-09 07:49:01
@nhahtdh 1個字節(最小長度爲8位) – 2013-03-09 07:51:54