2013-04-25 1 views
0

동적으로 "다차원 배열"을 만드는 데 문제가 있습니다. comp.lang.c FAQ에서 6.14를 읽었으며 거기에 나열된 코드를 따르고 있습니다. malloc을 사용하여 포인터에 대한 포인터 배열을 만들 때의 분할 오류

  cache_array = malloc(cm_blks * sizeof(int *)); 
      if (cache_array = NULL) { 
        fprintf(stderr, "out of memory\n"); 
        exit(1); 
      } 

      for (i = 0; i < cm_blks; i++) { 
        cache_array[i] = malloc(6 * sizeof(int)); 
        if (cache_array[i] == NULL) { 
          fprintf(stderr, "out of memory\n"); 
          exit(1); 

        } 
      } 

변수 cm_blks

8. cache_array와 같은 내 테스트 경우, 정수 초기화 등 :

int **cache_array; 

코드는 잘 컴파일,하지만 두 번째의 malloc 라인에서 세그먼트 오류를 ​​얻을 수 출력을 실행할 때.

답변

3

이 동등 검사가 아니라 인할당 :

NULLcache_array을 설정하고 할당의 결과가 본질적으로, 거짓으로 if 분기를 입력하지 않습니다
if (cache_array = NULL) 

. 그런 다음 코드는 NULL 포인터의 역 참조를 계속합니다.

변경하려면 다음

if (cache_array == NULL) 

나 :

if (!cache_array) 
+4

좋은 캐치. 그것은 많은 사람들에게 이상하게 보입니다. 그러나 조건 테스트에서 변수 앞에 변수를 배치하는 것이 좋습니다. 예 :'if (NULL = cache_array)'는 오류를 변수에 할당하려고 시도했을 때 일정한. 이런 종류의 미묘한 오류를 피할 수있는 편리한 방법입니다. –

+0

와우, 나는 그것을 완전히 놓쳤다! 눈의 두 번째 쌍을 주셔서 대단히 감사합니다! – user2321508