데이터의 2 진 청크를 저장하는 버퍼가 구조체의 배열에 복사되는 것으로 가정합니다 (각 구조체는 청크를 나타냄). 버퍼의 각 청크는 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 *에 복사 한 다음 해당 방법을 제공 할 수 있으면 감사히 생각합니다. 임시 struct 배열을 사용하지 않고이를 수행합니다.
printfs는이 함수를 호출 할 때 반환 된 포인터의 배열에 올바른 데이터 또는 루프 내에서 인쇄 된 동일한 데이터가 들어 있지 않지만 올바른 데이터를 인쇄합니다.
나는 offset_p의 배열이 올바른 값을 보유하지 못하게하는 포인터를 사용하는 방법인지 여부를 알고 싶습니다.
없음 메모리가offsets
에 할당되지 않은
'sizeof (header_offset) '가 20이라는 것을 확인 했습니까? 패딩 (padding) 때문에 24로 쉽게 될 수 있습니다. –
그 이유는 실제 구조체를 처리 할 때 id가 버퍼를 처리 할 때 HEADER_OFFSET_SIZE를 사용하고 sizeof (header_offset)를 사용하는 이유입니다. – Smokie
아, 좋아. 너는 그 사실을 알고있다.그냥 확인하고 싶었어. –