データのバイナリ チャンクを保持するバッファーは、構造体の配列 (各構造体はチャンクを表す) にコピーされることになっています。バッファー内の各チャンクは 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* にコピーするのに苦労していたので、一時的な構造体配列をバッファからコピーし、次に header_p* にコピーすることにしました。一時的な構造体配列を使用せずにそれを行います。
printfs は正しいデータを出力しますが、この関数を呼び出すと、返されるポインターの配列は正しいデータ、またはループ内で出力された同じデータを保持しません。
それ以上のコードなしで、offset_pの配列が正しい値を保持しない原因となるポインターの使用方法かどうかを知りたいです。