這是我一直試圖解決的調試問題。我知道我需要申請的位掩碼b
等於a
。我使用gdb檢查了a
和b
之間的差異。變量b
和a
爲char[]
類型,並在達到'錯誤'之前設置。指向變量的指針在取消引用時不更新變量
#include <string.h>
int main() {
char a[1] = "a";
char b[1] = "b";
int *x;
x = (int *) b;
// bug in next line
*x = *x & 0xffffffff;
return memcmp(a, b, 1);
}
直到a
等於b
,我解決不了這個問題。給出的唯一約束是該錯誤位於標註的行中,不會更改其他代碼。沒有規則說我不能在bug之後添加行,但在memcmp()
之前。我發現的問題是,我對位掩碼做的任何操作都不會改變b的值。我已經設置了斷點並檢查了錯誤前後x
和*x
的值,但x
似乎沒有改變。
Breakpoint 1, main() at test.c:9
9 *x = *x & 0xffffffff;
(gdb) print (int) a
$1 = -6922
(gdb) print (int) b
$2 = -6921
(gdb) print (int) x
$3 = -6921
(gdb) step
Breakpoint 2, main() at test.c:10
10 return memcmp(a, b, 1);
(gdb) print (int) a
$4 = -6922
(gdb) print (int) b
$5 = -6921
(gdb) print (int) x
$6 = -6921
我不明白如何通過修改錯誤所在行的常量來按要求的方式解決此問題。任何幫助瞭解如何使用x
更新b
使用按位掩碼將不勝感激。
正如你所做的標籤C++:不要使用C風格的轉換。在這種情況下,你必須使用'reinterpret_cast'來編譯它。無論何時您使用該關鍵字並且不確定知道爲什麼它是安全的,該代碼應該被認爲是錯誤的! –
我不相信你的編輯。調試器的輸出與代碼不一致。 –
是正確的,這是一個例子,我轉換成了一個最小的完整示例。所以顯示的整數值不代表「a」和「b」的實際值等。 –