【发布时间】:2013-01-10 01:09:08
【问题描述】:
我在 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))--;
}
}
不幸的是,int8_t 等数据类型仅保证它们的最小大小,根据 C99 规范,而不是确切大小。有什么方法可以就地重新转换和修改数据并保证我不会破坏我的阵列或接触相邻的数据点?此外,是否有一种等效的技术可以以某种方式适用于其他数据宽度(即:24 位、60 位等)?
【问题讨论】:
-
为什么不使用结构?使用结构的链表?
-
C 中的某些 API 使用 (void*) 来传递通用数据,并将其留给调用应用程序来确定与其他函数的数据格式。