我有以下代码:
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语句为true并执行时,我在应用程序的其他位置出现了一些奇怪的内存错误。当我注释掉第二个if语句时,问题正常。所以我怀疑我对64位数据进行按位运算的方式是不正确的。
任何人都可以在此代码中看到任何需要更正的内容吗?
答案 0 :(得分:2)
我怀疑dem_content_buff_size
和BytFldPos
之间的互动。如果不符合以下条件:
assert(dem_content_buff_size > (BytFldPos + 7));
然后你将溢出你的缓冲区。
答案 1 :(得分:1)
看起来很好 - 从我能看到的。在执行之前检查BytFldPos
范围是个好主意。
答案 2 :(得分:1)
我会检查dem_content_buff_size
对于64位数字是否足够大,并且BytFldPos+7
总是位于数组范围内。
答案 3 :(得分:0)
dem_content_buff
数组的每个元素都是unsigned char。您要为每个此类元素分配long long
。这是你的意图吗?
如果没有,它可能会导致数据损坏,因为转换会(或可能)失去价值。