データのバイナリチャンクを保持するバッファが構造体の配列にコピーされると仮定します(各構造体はチャンクを表します)。バッファの各チャンクは20バイトです。サイズのハッシュ値は、オフセット情報のため、8バイト、8:構造体をコピーするときに正しい値を取得しない
は、構造体の定義のthats:
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の配列に正しい値を保持しないポインタを使用しているかどうかを、コードなしで知りたいと思います。
'sizeof(header_offset)'が20であることを確認しましたか?パディングのために、それは容易に24である可能性があります。 –
これは、実際の構造体を扱うときに、idがバッファを扱うときにHEADER_OFFSET_SIZEを使用し、sizeof(header_offset)を使用する理由です。 – Smokie
ああ、良い。あなたはそれを認識しています。ちょうど確かめたかった。 –