2014-01-07 2 views
0

다음은 함수 안에 메모리를 재 할당하기 위해 C로 작성된 코드입니다. 나는 이것이 실행 중에 충돌하는 이유와 그것을 수행하는 효율적인 방법을 알고 싶다.함수 내부의이 realloc이 인텔 컴파일러에서 실행되지 않는 이유는 무엇입니까?

evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val, 
        int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val) 
     {  
     ........ 
     /* i,j, and k are calculated */ 
     *ptr_kn_row=(int*)realloc(*ptr_kn_row,k*sizeof(int)); 
     *ptr_kn_col=(int*)realloc(*ptr_kn_col,k*sizeof(int)); 
     *ptr_kn_val=(double*)realloc(*ptr_kn_val,k*sizeof(double)); 
     /* and*/ 
     *ptr_uk_row=(int*)realloc(*ptr_uk_row,j*sizeof(int)); 
     *ptr_uk_col=(int*)realloc(*ptr_uk_col,i*sizeof(int)); 
     *ptr_uk_val=(double*)realloc(*ptr_uk_val,i*sizeof(double)); 
     } 

다른 방법은 다음과 같습니다 : 메모리 할당이 실패 할 경우

evaluate_matrices(int **ptr_kn_row, int **ptr_kn_col, double **ptr_kn_val, 
        int **ptr_uk_row, int **ptr_uk_col, double **ptr_uk_val) 
     { 
     int *temp1,*temp2,*temp3,*temp4; 
     double *temp5,*temp6; 
     .......... 
     temp1 =(int*)realloc(*ptr_kn_row, k*sizeof(*temp1)); 
     if(temp1){*ptr_kn_row = temp1;} 
     temp2 =(int*)realloc(*ptr_kn_col, k*sizeof(*temp2)); 
     if(temp2){*ptr_kn_col = temp2;} 
     temp5 =(double*) realloc(*ptr_kn_val, k*sizeof(*temp5)); 
     if(temp5){*ptr_kn_val = temp5;} 
     ...... 
     temp3 = (int*)realloc(*ptr_uk_row, j*sizeof(*temp3)); 
     if(temp3){*ptr_uk_row = temp3;} 
     temp4 = (int*)realloc(*ptr_uk_col, i*sizeof(*temp4)); 
     if(temp4){*ptr_uk_col = temp4;} 
     temp6 = (double*)realloc(*ptr_uk_val, i*sizeof(*temp6)); 
     if(temp6){*ptr_uk_val = temp6;} 
     } 
+1

C 또는 C++을 쓰고 있습니까? C++을 쓰고 있다면 왜 처음에는'realloc()'을 사용하고 있습니까? 질문에 C가 명시 적으로 언급되어 있습니다. 좋은 질문입니다. C 및 C++로 태그 질문을 이중으로 사용하지 마십시오. 사람들을 화나게합니다 (C++에 대한 정답은 대개 C와 전혀 관련이 없기 때문입니다). –

+0

@JonathanLeffler, 그 반대 : – chris

+1

어떤 방법으로 이것이 "실행에 실패"합니까? 진단용'printf' 호출을 삽입하고 문제를 보여주는 출력을 보여줄 수 있습니까? i, j 및 k는 어떤 종류의 값 (크기의 순서)을 취합니까? – pmdj

답변

1

첫 번째 기능은 사소한 재앙

int main() 
    { 
     int *kn_row, *kn_col, *uk_row, *uk_col; 
     double *kn_val, *uk_val; 
     kn_row=NULL, kn_col=NULL, kn_val=NULL, uk_row=NULL, uk_col=NULL, uk_val=NULL; 
     evaluate_matrices(&kn_row, &kn_col, &kn_val, &uk_row, &uk_col, &uk_val); 
     ........ 
    } 

나는 기능의 두 가지 유형으로 시도했다. 이전에 할당 된 공간에 대한 포인터를 NULL로 덮어 씀으로써 메모리를 유출합니다. 메모리 부족 문제를 해결하기위한 전략이 '즉시 끝내기'라면, 이는 거의 중요하지 않습니다. 기억을 풀어 놓으 려한다면, 그걸 잃어 버렸습니다. 불운 이군요.

따라서 두 번째 기능이 더 좋습니다. 하지만 배열 크기를 추적 할 필요가있을 것입니다. 따라서 구조에 할당 된 데이터에 대한 포인터뿐만 아니라 크기 정보도 포함 할 원시 포인터보다는 구조를 사용하는 것이 더 나을 것이라고 생각합니다. 어떻게 든 각 배열에 할당 된 공간을 결정할 수 있어야합니다.

배열이있는 경우 배열을 재 할당 할 수없는 경우를 추적해야하므로 할당되지 않은 공간에 액세스하지 마십시오.

0

눈을 크게 뜨고 찾아보세요 : 나는 당신이 sizeof(double)을 의미하고이 그냥 복사 - 붙여 넣기 오류입니다 확신

*ptr_kn_val=(double*)realloc(*ptr_kn_val,k*sizeof(int)); 
              ^^^^^^^^^^^ 

.

많은 시스템에서 intdouble보다 작으므로이 경우 사용자의 충돌이 발생할 가능성이 큽니다. 즉, 정의되지 않은 동작은 메모리 블록의 끝을 지나서 쓰여진 후 어느 시점에 나타납니다.

+0

이는 오타입니다. 지적 해 주셔서 감사합니다. – Stoka