gpt4 book ai didi

c - 反转 void 数组和要转换成的数据类型

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:38 27 4
gpt4 key购买 nike

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

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。

干杯

最佳答案

how would I need to cast the array and what data type would I need to use? I tried casting it to uint_8 since its guaranteed to be of size 1Byte.

所以你快到了。

只是您不能取消引用 void 指针,因为不清楚它应该评估哪种类型,因为它指向 void

解决方案是将指针 转换为某些特定 指针类型。在你的情况下 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);

关于c - 反转 void 数组和要转换成的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53136072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com