我可以将整个数组从 *void 重新转换为 *int 吗?

标签 c arrays casting void

我有一个函数可以将一个二进制文件作为 void * 类型读入内存。文件头中的信息指示所需的内存量和实际数据类型(以每个数字的字节数为单位 - 例如,如果应将其解释为“长”,则为 8。

我的问题是,main 不知道所需的数据类型或内存。所以我这样调用函数:

long myfread(char *infile, void **tempdata,*datasize) 

char *infile="data.bin"; // name of the input file
void *tempdata=NULL; // where the data will be stored, initially 
long n; // total numbers read, returned by the function 
size_t datasize; // modified appropriately by the function 

n = myfread(infile,&tempdata,&datasize);

到目前为止一切顺利 - main 可以读取“tempdata”中的字节 - 但不能读取为(比如)整数或 float 。我的问题是,是否有一种简单的方法来重铸 tempdata 以实现这一点?

最佳答案

根据您编辑的问题,我可以猜测 myfread 是什么好像。极大地简化了,它做了这样的事情:

long myfread(const char *path, void **pmem, size_t *datasize) {
    long magically_found = 42;
    int *mem;
    int i;

    mem = malloc(magically_found * sizeof(int)); /* and we assume it works */
    *datasize = 12345;
    for (i = 0; i < magically_found; i++)
        mem[i] = i;
    *pmem = mem;
    return magically_found;
}

现在,在您的 main 中,你必须以某种方式知道如果 datasize == 12345返回时,分配的内存已填充 int秒。知道这一点,你就可以简单地写:

    int *ip;
    ... /* your code from above, more or less */
    if (datasize != 12345) {
        panic("memory was not filled with ints");
        /* NOTREACHED */
    }
    ip = tempdata;

从这里您可以访问 ip[i] , 对于任何有效的 i (至少 0 且小于 n )。

更棘手的问题是,您怎么知道 12345 表示 int如果不是 12345,你怎么办?而且,可能 12345 并不意味着 int反正。也许 4 表示 int or float这两者恰好都有一个 sizeof 4 个,在这种情况下,有 datasize == 4不告诉你到底是哪一个!那么,然后呢?

总而言之,这个问题听起来至少没有明确说明。

关于我可以将整个数组从 *void 重新转换为 *int 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993785/

相关文章:

c - 分割参数

c - 如何标准化 acosf 或 asinf 的输入值?

c++ - 将图像序列转换为视频

c - 重新分配二维字符数组

arrays - 如何在prolog中访问二维数组以及如何循环其中的每个元素

c++ - 未知的动态类型转换

javascript - 检查哈希数组是否包含哈希

php - 将 PHP 数组转换为 javascript 的最佳方法

c++ - 从 void 指针转换(创建通用存储)有什么问题吗?

C++ 类型转换数组