为 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()
或特定于平台的东西填充的缓冲区复制数据就这样。
在 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()
或特定于平台的东西填充的缓冲区复制数据就这样。