gpt4 book ai didi

c - 复制结构时没有获得正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:20 24 4
gpt4 key购买 nike

一个保存二进制数据 block 的缓冲区应该被复制到一个结构数组(每个结构代表一个 block ),缓冲区中的每个 block 是 20 个字节,前 4 个字节保存哈希值,然后 8 个字节用于一个偏移量信息,然后是 8 个大小:

这就是结构定义:

typedef struct{
khint_t hash; // 4
long int offset_start; // 8
size_t size; // 8
} header_offset, *offset_p;

下面是应该执行上述操作的代码:

  offset_p *offsets;
size_t s= HEADER_OFFSET_SIZE;

header_offset t_offsets[n_files];

for (i=0; i< n_files; i++){
memcpy(&t_offsets[i].hash, buff, sizeof(khint_t));
buff+= sizeof(khint_t);
memcpy(&t_offsets[i].offset_start, buff, sizeof(long int));
buff+= sizeof(long int);
memcpy(&t_offsets[i].size, buff, sizeof(size_t));
buff+= sizeof(size_t);

printf("hash read: %p\n", t_offsets[i].hash);
printf("offset start read: %p\n", t_offsets[i].offset_start);
printf("offset size read: %p\n", t_offsets[i].size);
}

memmove(offsets, t_offsets, sizeof(header_offset)*n_files);

buff-= s*n_files;
free(buff);

return offsets;

我一直在努力将 block 直接复制到 header_p* 中,所以我决定从缓冲区中复制一个临时结构数组,然后复制到 header_p* 中,如果您能提供给我,我将不胜感激一种不使用临时结构数组的方法。

printfs 打印正确的数据,尽管在调用此函数时,返回的指针数组不包含正确的数据,或者与循环中打印的数据相同。

我想知道,无需更多代码,我使用指针的方式是否会导致 offset_p 数组不包含正确的值。

最佳答案

没有为offsets分配内存, memmove()不为你分配内存:

<罢工> header_offset* offsets = malloc(sizeof(header_offset)*n_files);

鉴于您正在分配要使用 t_offsets 返回的内存不需要:只需填充 offsets直接。

编辑:

返回 header_offset*[]正如 alk 评论的那样:

header_offset** offsets = malloc(sizeof(header_offset*) * n_files);
for (i=0; i< n_files; i++){
*(offsets + i) = malloc(sizeof(header_offset));
...
}

关于c - 复制结构时没有获得正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com