为 void* 赋值

Assigning values to a void*

在 C 中,fread() 有一个 void* 参数,它将被赋予从文件中读取的下一个字节块的值。我的理解是使用 void* 以便可以为函数提供多种数据类型。但是,当我尝试在自己的函数中使用这种类型的参数时,似乎不允许为 void* 赋值。

例如:

void* ptr = malloc(sizeof(int));
int n = 5;
*ptr = n; //Error here

这给出了一个错误,指出 void 不可分配。如果是这种情况,那么它在 fread() 中是如何工作的?

也许您需要这个:int* ptr = malloc(sizeof(int));,或由 *(int*)(ptr) = n 重铸。

fread 的实现是您业务的 none,但大概它会从您的 void 指针创建一个类似 char 的指针,并假设您提供的指针已创建来自有效的非空对象指针。例如:

你:

int data[10];

fread(data, sizeof(int), 10, fp);

恐惧:

size_t fread(void * ptr, size_t sz, size_t nmemb, FILE * fp)
{
    char * dst = ptr;
    // read data into *dst in chunks of sz bytes
    // ...
}

这是有道理的,因为您可以将任何对象视为字符数组,但传递 void * 参数更简单,因为从对象到 void 指针的转换是隐式的,不需要显式转换。

根据定义无效是不可分配的。 你可以这样做:

*(int*)ptr = n;

但基本上您(可能)在分配内存的方式上犯了错误。我会推荐这个:

int* ptr = malloc(sizeof(int));
int n = 5;
*ptr = n;

fread() 使用类似 memcpy() 的东西从使用 read()_read()READ() 或特定于平台的东西填充的缓冲区复制数据就这样。