2014-12-04 3 views
0

크기 조정 가능한 배열을 사용하여 힙을 구현 중이며 메모리를 재 할당 할 때마다이 오류가 계속 발생합니다. 문제는 realloc과 함께입니다. 나는 그저 잘못된 점을 알아낼 수 없습니다. data_t 선언있어 여기double free 또는 corruption (fasttop) 오류

int main(int argc, char *argv[]){ 
    pthread_t r, c; 
    data_t data; 
    data.arraySize = 2; 
    data.size = 0; 
    long l = (long)data.arraySize; 
    data.heapElemOne = malloc(data.arraySize * sizeof(int)); 
    data.heapElemTwo = malloc(l * sizeof(long)); 

:

typedef struct{ 
    int arraySize; 
    int* heapElemOne; 
    long* heapElemTwo; 
    int size; 
    int number; 
    pthread_mutex_t mutex; 
    pthread_cond_t more; 
}data_t; 

그것을 변화하고 때 4에 메모리를 이전하지만, 여기에 삽입 기능입니다 :

void* insert (data_t *data, int room, long wake) { 
if(data->size+1 == data->arraySize){ 
    data->arraySize *= 2; 
    long l = (long)data->arraySize; 
    int* tempOne = realloc(data->heapElemOne, data->arraySize*sizeof(int)); 

    long* tempTwo = realloc(data->heapElemTwo, l*sizeof(long)); 

    if (tempOne != NULL &&tempTwo !=NULL){ //realloc was 
     data->heapElemOne = tempOne; 
     data->heapElemTwo = tempTwo; 
    } 
    else{ //there was an error 
     printf("Error allocating memory!\n"); 
     free(data->heapElemOne); 
     free(data->heapElemTwo); 
     return; 
    } 

    } 
    data->size++; 
    int now = data->size; 

    /*Adjust its position*/ 
    if(data->size >0){ 

    while(data->heapElemTwo[now/2] > wake && ((now/2)!=0)) 
    { 
      data->heapElemTwo[now] = data->heapElemTwo[now/2]; 
      data->heapElemOne[now] = data->heapElemOne[now/2]; 
      now /= 2; 
    } 
    } 

    data->heapElemTwo[now] = wake; 
    data->heapElemOne[now] = room;` 

그리고 여기에 주요의 일부입니다 8로 설정하면 오류가 발생합니다. 나이가 들면서 그걸 알아낼 수 없습니다. -_- 미리 감사드립니다! mallocrealloc

+0

http://stackoverflow.com/ help/mcve –

+0

실제로 필요한 것이 무엇인지 파악할 수 없습니다. – Gopi

+0

'malloc()'과'realloc()'을 호출 할 때마다 'sizeof (int)'또는'sizeof (long)'에 의해 할당 될 원소의 수를 당신이 저장하는 데이터? – ua2b

답변

0
malloc(data.arraySize) 

이 다른 모든 호출은 잘못이다. 당신은 당신의 요소 유형에 따라

malloc(data.arraySize * sizeof(int)) 

또는 각각

malloc(data.arraySize * sizeof(long)) 

를 원한다. malloc 및 친구들은 바이트 단위로 할당 크기를 허용하고 intlong은 일반적으로 1 바이트보다 큽니다. 따라서 배열이 너무 짧게 할당되고 버퍼 오버런이 발생합니다.

+0

크기 2로 지정했기 때문에 작동하지 않습니다. * sizeof (int)를 이미 오래 전에 추가했지만 여전히 작동하지 않습니다./ – scl

+0

제발 엽총 프로그램을 사용하지 마십시오. 'malloc (data.arraySize)'가 잘못되었으므로, 단지 그것을 시도해 볼 필요가 없습니다. 'malloc'과 친구들에 대한 올바른 호출로 코드를 업데이트하십시오. 문제가 지속되면 여기에 코드 단편과 다른 단편을 게시하지 말고 MCVE를 게시하십시오. –

+0

고마워, 실제로 정리 기능을 추가했을 때 실제로 작동하고있어 ... 아무 생각 : /하지만 malloc과 realloc을 사용하는 방식으로 작동하지 않을 것이라고 생각하지 마라. 고마워! :) – scl

0

문제는 거의 확실하게 realloc과 관련이 없습니다. realloc은 다양한 범위의 환경에서 테스트되었으며 신뢰할 수 있습니다. 귀하의 코드가 다른 할당 된 구조의 배열 범위를 초과하지 않는지 확인하십시오.

할당 상한을 초과해야합니다. realloc은 chars를 할당하지만, 배열은 문자보다 거의 확실합니다.

이러한 변경을 시도하십시오 : . int * tempOne = realloc (data-> heapElemOne * sieof (int), data-> arraySize); long * tempTwo = realloc (data-> heapElemTwo, sizeof (long));

+0

내가 realloc을 잘못 사용했을 수도 있습니다. 나는 그 변화를 시도했다. – scl

0

나는 그것을 알아 냈다. 나는 어떤 이유로 sigint가 수신 될 때 내 스레드에 대한 정리 기능을 추가했을 때 어떤 이유로 오류가 발생했다 :/ 나는 초보자 다./ 도움을 주셔서 감사합니다 :) malloc과 realloc을 처음 사용하는 방식도 처음부터 잘못되었습니다.

관련 문제