2012-05-01 3 views
1

데이터의 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에 할당되지 않은
+0

'sizeof (header_offset) '가 20이라는 것을 확인 했습니까? 패딩 (padding) 때문에 24로 쉽게 될 수 있습니다. –

+0

그 이유는 실제 구조체를 처리 할 때 id가 버퍼를 처리 할 때 HEADER_OFFSET_SIZE를 사용하고 sizeof (header_offset)를 사용하는 이유입니다. – Smokie

+0

아, 좋아. 너는 그 사실을 알고있다.그냥 확인하고 싶었어. –

답변

4

, memmove() 당신을위한 메모리를 할당하지 않습니다

header_offset * 오프셋 = malloc을 (를 sizeof (header_offset) * n_files를); 당신의 메모리가 t_offsets의 사용을 반환 할 할당되는 점을 감안

이를 unrequired입니다 : 그냥 직접 offsets을 채 웁니다.

EDIT : 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)); 
    ... 
} 
+0

필자는 OP에서 포인터의 배열에 대한 참조 ('header_offset')가 반환되어야 함을 이해하면 솔루션은'header_offset'의 배열에 대한 참조를 반환합니다. – alk

4

offsets 기발한 포인터 아닌 구조체의 배열이다.

memcopy는 아마도 offsets에 할당 된 메모리 끝을 지나치게 큰 메모리 덩어리를 덮어 씁니다. 그러나 할당 된 메모리 양은 알 수 없습니다. 뿐만 아니라

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); 
} 
1

header_offset에 (다음 offset_p *offsets; 에 의해 참조) 자체가 할당 될 필요가 배열을 포인터의 배열을 반환하려면

offset_p *offsets = (offset_p*)malloc(sizeof(offset_p)*n_files); 

을 그리고 루프 :

나는 좋을 것 임시 구조체가 현재 보유하고있는 데이터를 보유하는 메모리로 후자는 offsets이 보유한 포인터에 의한 참조가됩니다.

관련 문제