我为这样的数组分配了内存:
void *buf;
buf = calloc(8192, 1);
现在我从原始文件的文件流中读取8192字节到阵列:
uint32_t fpos = 0;
int n;
n = fread(buf,1,8192,file);
fpos += n;
我会使用类似的功能:
static void reverseBuffer(void *buf){
for(int a = 0; a < sizeof(buf)>>1; a++){
uint8_t temp = (uint8_t) buf[a];
buf[a] = buf[sizeof(buf) - a - 1];
buf[sizeof(buf) - a - 1] = temp;
}
}
很显然,它实际上是行不通的,我该如何转换数组以及需要使用哪种数据类型?我尝试将其强制转换为uint_8,因为它的保证大小为1Byte。
欢呼
答案 0 :(得分:1)
在不知道类型的情况下无法反转数组。
考虑反转数组的含义。我们要交换第一个和最后一个元素,第二个和倒数第二个元素,依此类推。
[0, 1, 2, 3] => [3, 2, 1, 0]
之所以可行,是因为我们知道每个元素的大小。实际上,数据以一和零存在。
只有知道第一个和最后一个元素的大小时,我们才能交换第一个和最后一个元素。
// Element size is 3 bits
[000, 001, 010, 100] => [100, 010, 001, 000]
不知道每个元素的大小,就不可能知道第一个元素在哪里停止以及应该交换什么。
// Unknown element size
000001010100
// Element size 1
[0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0] => [0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0]
// Element size 2
[00, 00, 01, 01, 01, 00] => [00, 01, 01, 01, 00, 00]
// Element size 4
[0000, 0101, 0100] => [0100, 0101, 0000]
类型定义形成一个元素的位数(例如,一个int可能是32位,而一个long可能是64位)。
如果不知道类型,就不可能知道元素大小,而如果不知道元素大小,就不可能反转列表。
答案 1 :(得分:1)
我将如何转换数组以及需要使用哪种数据类型?我尝试将其强制转换为
uint_8
,因为它的大小保证为1Byte。
所以您快到了。
只是您不能取消引用void
指针,因为它指向void
时不清楚应评估哪种类型。
解决方案是将 pointer 转换为某些特定的指针类型。对于您来说,uint8_t*
只能取消引用。
您的代码还假设sizeof buf
将为您提供数组的大小,但事实并非如此。它为您提供buf
的大小,并且由于buf
是一个指针(void*
),您将获得一个指针的大小,该大小为4或8个字节,具体取决于您所使用的操作系统运行此代码。
因此,您需要使函数知道数组的大小。只需将其传递即可。
该函数可能如下所示:
static void reverseBuffer(size_t size, void * buf) {
for (size_t a = 0; a < size >> 1; a++) {
uint8_t temp = ((uint8_t*) buf)[a];
((uint8_t*) buf)[a] = ((uint8_t*) buf)[size - a - 1];
((uint8_t*) buf)[sizeof- a - 1] = temp;
}
}
或引入一个正确键入的局部变量:
static void reverseBuffer(size_t size, void * buf) {
uint8_t * p = buf;
for (size_t a = 0; a < size >> 1; a++) {
uint8_t temp = p[a];
p[a] = p[size - a - 1];
p[size - a - 1] = temp;
}
}
或已经使用正确的类型定义了函数:
static void reverseBuffer(size_t size, uint8_t * p) {
for (size_t a = 0; a < size >> 1; a++) {
uint8_t temp = p[a];
p[a] = p[size - a - 1];
p[size - a - 1] = temp;
}
}
这样称呼
reverseBuffer(8192, buf);
答案 2 :(得分:-1)
在您的循环中,也许用sizeof(buf)>>1
而不是sizeof(buf)>>2
可以使您的代码正常工作。