2010-03-15 92 views
0

我有以下代碼:C++ 64位問題

tmp_data = simulated_data[index_data]; 
unsigned char *dem_content_buff; 
dem_content_buff = new unsigned char [dem_content_buff_size]; 
int tmp_data; 
unsigned long long tmp_64_data; 

if (!(strcmp(dems[i].GetValType(), "s32"))) 
{ 
    dem_content_buff[BytFldPos] = tmp_data; 
    dem_content_buff[BytFldPos + 1] = tmp_data >> 8; 
    dem_content_buff[BytFldPos + 2] = tmp_data >> 16; 
    dem_content_buff[BytFldPos + 3] = tmp_data >> 24;  
} 

if (!(strcmp(dems[i].GetValType(), "f64"))) 
{ 
    tmp_64_data = simulated_data[index_data]; 
    dem_content_buff[BytFldPos] = tmp_64_data; 
    dem_content_buff[BytFldPos + 1] = tmp_64_data >> 8; 
    dem_content_buff[BytFldPos + 2] = tmp_64_data >> 16; 
    dem_content_buff[BytFldPos + 3] = tmp_64_data >> 24; 
    dem_content_buff[BytFldPos + 4] = tmp_64_data >> 32; 
    dem_content_buff[BytFldPos + 5] = tmp_64_data >> 40; 
    dem_content_buff[BytFldPos + 6] = tmp_64_data >> 48; 
    dem_content_buff[BytFldPos + 7] = tmp_64_data >> 56; 
}  

我得到的應用程序的其他地方一些奇怪的內存錯誤時,第二if語句是真實和執行。當我將第二條if語句註釋掉時,問題可以正常工作。所以我懷疑我對64位數據執行按位操作的方式不正確。

任何人都可以在此代碼中看到任何需要更正的內容嗎?

+3

在聲明tmp_data之前如何賦值?你應該發佈你的* real *代碼,因爲這不會被編譯。 – 2010-03-15 20:19:39

+1

什麼是dem_content_buff_size? – 2010-03-15 20:20:43

+1

這些都不會回答你的問題,但是:1)你可能想要交換第一行和第四行2)tmp_64_data的目的是什麼? 3)如果第二個「if」是「else if」? – 2010-03-15 20:21:05

回答

2

我會懷疑dem_content_buff_sizeBytFldPos之間的相互作用。如果以下情況不成立:

assert(dem_content_buff_size > (BytFldPos + 7)); 

然後你要溢出你的緩衝區。

1

看起來很好 - 從我能看到的。在執行之前檢查BytFldPos範圍將是一個好主意。

1

我會檢查dem_content_buff_size是否足夠大的64位數字,也BytFldPos+7總是位於數組範圍內。

0

dem_content_buff數組的每個元素都是一個無符號字符。你正在分配到每個這樣的元素long long。這是你的意圖嗎?

如果不是,則可能導致數據損壞,因爲該轉換將會(或可能)失去價值。