2014-03-28 153 views
0

我有這樣的代碼:運行時檢查失敗#2 - 堆棧圍繞變量 '' Z」被破壞

char z[9]; 
Int_To_BCD(vInt, z); 
Buflen += sprintf(BufStr + Buflen, "(%s)", z); 

和:

無效INT_TO_BCD(INT VAL ,焦炭*總分){

int i = 0; 
    int j = 0; 
    int outIndex = 0; 
    unsigned char digits[4]; 
    unsigned char Digit[2]; 

    memcpy((void*)digits, (void*)&val, 4); 

    for (i = 0; i <= 3; i++) { 
    Digit[0] = (digits[i] & HIGH)/16; 
    Digit[1] = digits[i] & LOW; 

    for (j = 0; j < 2; j++) { 
     sprintf(&(out[outIndex]), "%d", Digit[j]); 
     outIndex++; 
    } 
    } 
    if (outIndex == 0) { 
    sprintf(&(out[outIndex]), "%d", 0); 
    outIndex++; 
    } 

    out[outIndex] = '\0'; 

} 

在調試模式:程序運行,直到主函數結束並顯示消息:

運行時檢查失敗#2 - 堆棧周圍的變量「Z」被損壞

outIndex的maximun是總是8。 z有8個字節的內存。不是嗎?

什麼問題?

謝謝!

+0

其他的東西可以覆蓋它。檢查所有數組並徹底循環。 – nonsensickle

回答

2

這裏你似乎採取了字節的上半部分和下半部分。

Digit[0] = (digits[i] & HIGH)/16; 
Digit[1] = digits[i] & LOW; 

這些十六進制位數:它們的範圍從0-15。

這意味着如果最後一位數字大於9,sprintf%d將打印3個字符(2位和\0),並且您將發生緩衝區溢出。

+0

嘿!它是可能的。謝謝!我會用z [12]嘗試:P – user2459082

1

使用%C來代替%d在

sprintf(&(out[outIndex]), "%d", Digit[j]); 

是它的工作呢?

+0

是的,它工作得很好,我需要的是數字,而不是角色。例如:(46120000'\ 0') – user2459082

+0

請嘗試%x。 – gbjbaanb

+0

%c說你想寫出一個字節。 –

相關問題