首页 > 解决方案 > 包含指向 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);

我的完整代码在这里点击

标签: cpointersstructmemcpy

解决方案


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_bitmapandf1.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它不关心数据类型,它关心源地址、目标地址和要复制的数据量。


推荐阅读