c - 包含指向 void 指针的指针变量的 memcpy 结构
问题描述
我喜欢这个结构
struct free_bitmap{
int *node_bitmap;
int *data_bitmap;
}
我想将此结构复制到固定内存块并以二进制模式写入文件并将此数据从文件读取到固定内存块。然后使用 memcpy 将此数据复制到结构。
像这样
struct free_bitmap f1;
struct free_bitmap f2;
f1.node_bitmap = (int *) malloc( sizeof(int) * 20 );
f1.data_bitmap = (int *) malloc( sizeof(int) * 128);
void * fblock = (void *) malloc(256);
memcpy((char*)fblock,(void*) &f1 ,256 );
int fd = open("test",O_RDWR|O_CREAT, 0600);
write(fd,fblock,256);
free(fblock);
我可以这样写数据,但我不确定 memcpy 是否正在复制我的指针变量。我读取了文件但不起作用。
block = (void *) malloc(256);
lseek(fd, 0, SEEK_SET);
read(fd,fblock,256);
f2.node_bitmap = (int *) malloc( sizeof(int) * 20 );
f2.data_bitmap = (int *) malloc( sizeof(int) * 128);
memcpy((void*) &f2 , (char*)fblock , 256 );
free(fblock);
for(i=0;20>i;++i)
printf("%d " ,f1.node_bitmap[i]);
free(f2.node_bitmap);
free(f2.data_bitmap);
我的完整代码在这里点击
解决方案
memcpy((char*)fblock,(void*) &f1 ,256 );
似乎这memcpy
使您的代码失败。如果要复制包含指针(或数组)的结构,则应使用memcpy
该结构的每个参数。例如,如果你想复制 256 字节的结构来指向该指针fblock
指向的地址:
memcpy(fblock,f1.node_bitmap ,20*sizeof(int));
// then copy the `256-20*sizeof(int)` by of `f1.data_bitmap` to `fblock`
memcpy(((uint8_t *))fblock + 20*sizeof(int),f1.data_bitmap ,256-20*sizeof(int));
// Note that, you should initialize the data in f1.data_bitmap before copying
如果要将所有数据复制到f1.data_bitmap
andf1.node_bitmap
中,则必须为此指针fblock
分配至少字节。128*sizeof(int) + 20 * sizeof(int)
当您要将数据复制到f2
结构时也是类似的:
memcpy((void*) &f2 , (char*)fblock , 256 );
您可以更改为:
memcpy(f2.node_bitmap, fblock, 20*sizeof(int));
memcpy(f2.data_bitmap, (uint8_t *)fblock + 20*sizeof(int), 256 - 20 *sizeof(int));
您可以查看有关复制结构的更多信息:将一个结构复制到另一个结构。
另一件事,你不应该转换malloc
函数:我转换 malloc 的结果吗?
如果代码喜欢memcpy(fblock,f1.node_bitmap ,20*sizeof(int));
,则不需要强制转换源和目标指针,因为memcpy
它不关心数据类型,它关心源地址、目标地址和要复制的数据量。
推荐阅读
- javascript - 通过单击添加类并捕获添加的类
- angular - 如何在 Material Angular 组件样式中覆盖 Sass 变量?
- arrays - 如何在 VB.net 中将字符串拆分为输入的长度字符串数组
- php - 如何在 wordpress 模板 php 文件中查找和编辑特定元素属性?
- excel - 计算结果为零时如何跳过一行?
- python - 在python中发布错误请求rest api
- swift - “删除信息”如果其值为空 Firestore Swift
- c# - MySQL 向空 HTML 段落添加问号 (?)
- c++ - 如何从 OpenGL 着色器中的纹理贴图绘制贴图?
- css - 如何软化 CSS 上的溢出边缘