保存二进制数据块的缓冲区应该被复制到结构数组(每个结构代表一个块),缓冲区中的每个块都是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;
我正在努力将块直接复制到header_p *中,所以我决定从缓冲区复制一个临时的struct数组,然后复制到header_p *,如果你能提供给我,我会更感激一种不使用临时结构数组的方法。
printfs打印正确的数据,但是在调用此函数时,返回的指针数组不包含正确的数据,也不包含循环中打印的相同数据。
我想知道,没有进一步的代码,是否使用指针导致offset_p的数组不能保持正确的值。
答案 0 :(得分:4)
没有为offsets
分配内存,memmove()
没有为您分配内存:
<击> header_offset * offsets = malloc(sizeof(header_offset)* n_files); 击>
鉴于您要分配要返回的内存,因此不需要使用t_offsets
:只需直接填充offsets
。
编辑:
要按alk评论{}回复header_offset*[]
:
header_offset** offsets = malloc(sizeof(header_offset*) * n_files);
for (i=0; i< n_files; i++){
*(offsets + i) = malloc(sizeof(header_offset));
...
}
答案 1 :(得分:4)
offsets
应该是一个指针的数组,而不是结构。
memcopy可能会覆盖超过为offsets
分配的内存末尾的大块内存(尽管我们无法看到为它分配了多少内存)。
我建议:
offset_p *offsets = (offset_p*)malloc(sizeof(offset_p)*n_files);
然后循环
for (i=0; i< n_files; i++){
offsets[i] = malloc(sizeof(header_offset));
memcpy(&(*offsets[i]).hash, buff, sizeof(khint_t));
buff+= sizeof(khint_t);
memcpy(&(*offsets[i]).offset_start, buff, sizeof(long int));
buff+= sizeof(long int);
memcpy(&(*offsets[i]).size, buff, sizeof(size_t));
buff+= sizeof(size_t);
}
答案 2 :(得分:1)
要返回指向header_offset
的指针数组,需要分配数组(然后由offset_p *offsets;
引用)以及保存临时结构当前保存的数据的内存。后者将由offsets
所持有的指针引用。