在C中,fread()有一个void *参数,该参数将被赋予从文件中读取的下一个字节块的值。我的理解是使用void *,以便可以为函数提供多种数据类型。但是当我尝试在我自己的函数中使用这种类型的参数时,似乎不允许为void *赋值。
例如:
void* ptr = malloc(sizeof(int));
int n = 5;
*ptr = n; //Error here
这给出了一个错误,指出void不可分配。如果是这种情况那么它在fread()中是如何工作的?
答案 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()
填充的缓冲区中的数据或某些特定平台