2011-06-28 117 views
2

代碼:http://paste.pocoo.org/show/422081/(鏈接404缺失)。GCC +內聯彙編 - notl上意外的段錯誤

好吧,所以我試圖不通用塊的內存,並決定我做了愚蠢的鑄造diddling,並認爲我會下降到行內大會(我認爲它實際上提高了可讀性)。我設法將此段錯誤縮小爲一個特定的功能。它在粘貼的第22行。

然而,它總是segfaults。正如你所看到的,str是作爲argv [1]傳遞的。

我可以做手工的東西做argv [1](例如argv[1][0] = 'q'),所以我不完全知道爲什麼,不是不工作,特別是考慮到此前在nots它成功運行not8not2。有沒有什麼新奇的事情我不知道?這裏有什麼問題?

此外,一般的代碼審查會很好;我相當陌生C.

+0

在什麼電腦上運行?你使用eax作爲指針,但是如果你有64位計算機/系統,你必須使用rax(也許not8和not2只是意外不要segfault)。 – flolo

+0

你的not13函數遺漏了字符串的一個字節(字節12),如果這是無意的,你可能想要修復這個問題 – Necrolis

+0

@flolo我認爲這樣做!現在我將讓它突然離開,看看我的算法是否有效;)。 @Necrolis Eep!好眼睛。 –

回答

2

你的問題是password變量。您只分配一個元素,然後在for循環中執行password++。所以你第二次做這個循環時,你在無處的土地上。

該代碼表明您使用的太複雜的概念比您目前掌握的要複雜得多。

  • 不要做內聯彙編當你 還不知道如何處理 指針。
  • 不要投下malloc的回報。
  • unsigned char一般是 正確的類型檢查對象的個人 字節。
+0

哦,織補。我忘了改變這個密碼的增量,而這只是一個普通的長時間。謝謝:\(我應該在調試器中完成整個過程)。關於施放malloc的返回值,是不是返回void *?手冊頁這樣說。你爲什麼不去施放它?我會交換到unsigned char,謝謝。 –

+0

@corey:在C語言中,你可以給任何指針類型賦一個'void *'而不用強制轉換。但是在這種情況下演員陣容並不是有害的(編譯器應該忽略它)。 – Necrolis

+0

@Corey,在C中,你可以給任何其他數據指針類型分配一個'void *'。這是爲此而做的。如果你投了'malloc',你可能隱藏了你可能忘記了正確的包含文件的事實,因此'malloc'的返回類型默認爲'int'。 –