反转空数组以及要强制转换为的数据类型

时间:2018-11-03 22:29:35

标签: c casting void-pointers

我为这样的数组分配了内存:

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。

欢呼

3 个答案:

答案 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可以使您的代码正常工作。

相关问题