我在開發過程中,使用了sscanf來讀取使用者輸入的16進製制數字到陣列,結果遇到了堆疊被破壞.原來sscanf沒有邊界檢查,他預設的輸出引數為4個位元組的.如果你像如下定義.
int x=10;
byte d[2];
sscanf("ffff","%2x%2x",d[0],d[1]);
如果你這樣的話,堆疊裡的x將被破壞,以為sscanf的輸出引數預設是4位元組的.所以當呼叫第乙個d[0]的時候,其實他已經將d[1]裡面的資料也進行填充,如果到呼叫d[1]的時候,他就將出新記憶體越界訪問,填充d[1]指標後的1位元組記憶體塊.所以你的程式將留下隱藏的病.
解決方案.
在vs2005以上請使用sscanf_s()函式
int x=10;
byte d[2];
sscanf_s("ffff","%2x%2x",d[0],1,d[1],1);
在vc6下面沒有sscanf_s()函式,則採用加大記憶體塊的方式來解決.
int x=10;
byte d[10];
sscanf("ffff","%2x%2x",d[0],d[1]);
這樣就沒有問題了,他依然會破壞d[1]後面的資料,不過,由於我們分配了多餘的記憶體,只要不去讀d[1]後面那些記憶體就可以了.
謹慎使用php的strtotime 函式
我們在日常業務中,針對業務量,經常會採用對資料庫按時間做橫向分表,分表後的查詢往往會涉及到時間問題。例如,我們想查詢某個使用者距離當前時間1個月的訂單情況,在這個時候,我們有些會用到strtotime 函式去處理。但是使用strtotime 需要非常謹慎。我們先看一段 目的是想拿到幾個月以前的年份月...
sscanf 函式使用注意事項
在除錯 時,發現使用 sscanf 函式的乙個問題,在以後使用該函式時要注意避免 例如程式如下 word dwvalue cstring strbuf sscanf strbuf,d dwvalue 呼叫 sscanf strbuf,d dwvalue 後,會為dwvalue賦值,卻影響了4個位元組...
sscanf 函式用法
read formatted data from a string.intsscanf constchar buffer,constchar format argument intswscanf constwchar t buffer,constwchar t format argument a f...