我在 C 中有一个简单的函数,它提供了一个void*
指向数据数组的指针。我知道这个内存块中每个单独数据点的大小(以字节为单位),并且需要保证我可以修改这个块中的每个数据点,而不会意外改变相邻的数据点。在此示例中,我想将每个值减 1。
所有数据点都是 8 位、16 位或 32 位。
例如:
void myFunction(void* data, size_t arraySize, size_t widthPerDataPoint)
{
if(!data)
return -1;
size_t w = widthPerDataPoint;
int numPoints = arraySize / widthPerDataPoint;
int i;
for(i=0; i<numPoints; i++)
{
if(w==1) // 8 bit
(*((int8_t*)data + i))--;
else if(w==2) // 16 bit
(*((int16_t*)data + i))--;
else if(w==4) // 32 bit
(*((int32_t*)data + i))--;
}
}
不幸的是,根据 C99 规范,int8_t 等数据类型仅保证其最小大小,而不是确切大小。有什么方法可以就地重新转换和修改数据并保证我不会破坏我的阵列或接触相邻的数据点?此外,是否有一种等效的技术可以以某种方式适用于其他数据宽度(即:24 位、60 位等)?