假设我有一个这样的数组:
unsigned char a[10][10];
我想使用fread将字节读入此数组(行主要顺序):
FILE *f = fopen("xxx.bin", "rb");
fread((unsigned char *)a, 1, 10 * 10, f);
fclose(f);
由于fread的第一个参数属于void *
类型,是否有标准方式将unsigned char a[10][10]
转换为void *
?我应该使用static_cast
还是reinterpret_cast
或?由于c ++中的2d数组是连续分配的,我认为将其重新解释为指针是合理的。
答案 0 :(得分:2)
为了让void*
指向a
,只需取其地址(&a
)并让编译器隐式转换为void*
:
fread(&a, sizeof a, 1, f);
有几点需要注意:
答案 1 :(得分:1)
以下内容适用于gcc 4.8.2:
FILE *f = fopen("xxx.bin", "rb");
fread(a, sizeof(unsigned char), 10 * 10, f);
fclose(f);
如果您更喜欢显式强制转换,那么标准方法是使用static_cast
。应该使用它,因为它在转换为void*
时会保留地址。
FILE *f = fopen("xxx.bin", "rb");
fread(static_cast<void*>(a), sizeof(unsigned char), 10 * 10, f);
fclose(f);
reinterpret_cast
只保证如果您将某些内容投射到void*
然后再投放回您的类型,那么您将获得相同的值。