将值赋给void *

时间:2015-01-02 00:36:39

标签: c fread

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

例如:

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

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

4 个答案:

答案 0 :(得分:3)

fread的实现不属于您的业务,但可能会从您的void指针创建一个char - 类指针,并假设您提供的指针是从有效的非指针创建的null对象指针。例如:

您:

int data[10];

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

<强>的fread:

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 *参数更简单,因为从object到void指针的转换是隐式的,并且不需要显式转换。< / p>

答案 1 :(得分:0)

也许你需要这个:int* ptr = malloc(sizeof(int));,或者按*(int*)(ptr) = n重新制作。

答案 2 :(得分:0)

根据定义,

void不可分配。 你可以这样做:

*(int*)ptr = n;

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

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

答案 3 :(得分:0)

fread()使用类似memcpy()的内容来复制使用read()_read()READ()填充的缓冲区中的数据或某些特定平台