2016-06-01 2 views
-6

을 사용할 때 C - 프로그램이 충돌합니다. 내 영어 jeje를 유감스럽게 생각합니다. 나는 그것을 말하지 않는다. 메모리를 무료로() 함수를 사용하는 경우무료 함수

내가 문제가 있어요,이게 내가 무엇을 가지고 : 나는 윈도우 7에 codeblocks를 사용하고

Using free() function in C

내가 사용 약 3 년입니다 다이나믹 메모리 할당이 문제가 발생하는 것은 처음입니다. 문제가

equal Directions

약도 및 기능 밖으로 동일한 GCC 컴파일러라고 말할 사람들이있을 수 있습니다, 그래서 내가 잘못된 포인터

+4

코드를 이미지로 게시하지 마십시오. 질문에 직접 텍스트로 코드를 게시하십시오. 또한 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)을 게시하는 것을 잊지 마십시오. – MikeCAT

+3

그들은 [당신은 malloc()의 결과를 C로 캐스팅해서는 안된다]라고 말한다. (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – MikeCAT

+0

무엇이 문제입니까? –

답변

0

을 확보하기 위해 노력하고있어 생각하지 않는다 코드의 오류는 다음과 같습니다

  • M == NULLmalloc 성공 여부를 확인하는 올바른 방법이 아닙니다. 값이 (*M)이 아니고 M이 아니기 때문에 (*M) == NULL을 사용해야합니다.
  • ReservarMemoriaMatrizi<=m의 루프 상태가 잘못되었습니다. i<=n이어야합니다.
  • (*M)[n]LiberarMemoriaMatriz에 놓으 셨습니다.

수정 코드 :

void LiberarMemoriaMatriz(double*** M,int n){ 
    int i = 0; 
    if(M == NULL) return; 
    for(i=0; i<=n; i++){ 
     free((*M)[i]); 
    } 
    free(*M); 
} 

int ReservarMemoriaMatriz(double*** M, int n, int ,){ 
    int i = 0; 
    if(M == NULL) return 0; 
    (*M) = malloc((n+1)*sizeof(double*)); 
    if((*M) == NULL){ 
     return 0; 
    } 
    for(i = 0; i<=n; i++){ 
     (*M)[i] = malloc(m*sizeof(double)); 
     if((*M)[i] == NULL){ 
      /* free what is allocated before failing */ 
      for(i--; i>=0; i--) free((*M)[i]); 
      free(*M); 
      return 0; 
     } 
    } 
    return 1; 
} 
+0

ReservarMemoriaMatriz의 2-4 줄은 여전히 ​​틀린 것 같습니다. 아마도 호출자가 첫 번째 매개 변수로'& M'을 전달하고 있으며, 결코 NULL이 될 수 없습니다. 두 번째 줄은 의미가 없습니다. 4 행은 * M에 M이 아닌 NULL이 있는지 확인해야합니다. 호출자가 & M을 LiberarMemoriaMatriz로 전달한다고 가정 할 때도 마찬가지입니다. – FredK

1

루프 할당의 두 번째 라운드에 n하지 m을 사용해야합니다 귀하의.

for (i=0; i < n; i++) // You're using m here: use n 
{ 
    ... 
    malloc(m...) // Here m is correct 
0

나는 라인 별을보고 있었다 마지막으로 실수를 발견 : 당신이 말한다 무엇

내가 좋아하는을 :

실패하기 전에 할당되는 것을

무료

내가 바꾼 또 다른 것은 내가 사용하는 메모리를 할당 할 때이다 :

(*M) = (double**)malloc(n * sizeof(double*)); 

및 루프 조건, i < n 등 모든 것이 정상적으로 작동합니다.