38.3 코드 오류
, 홍 영준님이 작성#include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 int main() { int **m = malloc(sizeof(int *) * 3); // 이중 포인터에 (int 포인터 크기 * 세로 크기)만큼 // 동적 메모리 할당. 배열의 세로 for (int i = 0; i < 3; i++) // 세로 크기만큼 반복 { m[i] = malloc(sizeof(int) * 4); // (int 크기 * 가로 크기)만큼 동적 메모리 할당. // 배열의 가로 } m[0][0] = 1; // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당 m[2][0] = 5; // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당 m[2][3] = 2; // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당 printf("%d\n", m[0][0]); // 1: 세로 인덱스 0, 가로 인덱스 0인 요소의 값 출력 printf("%d\n", m[2][0]); // 5: 세로 인덱스 2, 가로 인덱스 0인 요소의 값 출력 printf("%d\n", m[2][3]); // 2: 세로 인덱스 2, 가로 인덱스 3인 요소의 값 출력 for (int i = 0; i < 3; i++) // 세로 크기만큼 반복 { free(m[i]); // 2차원 배열의 가로 공간 메모리 해제 } free(m); // 2차원 배열의 세로 공간 메모리 해제 return 0; }보시다시피 비주얼 스튜디오 2019에 38.3예제의 코드를 그대로 복사한 다음 붙여넣고 실행해봤는데 11번째 줄과 15번째 줄에서 각각 'NULL포인터 m을 역참조 하고 있습니다. ', NULL포인터 m[0]을 역참조 하고 있습니다.' 라고 오류가 나오면서 실행창에는 아무 것도 나오지 않고 있습니다. 왜 그런걸까요?
Re: 38.3 코드 오류
, 도장_ 관리자님이 작성문제 없이 실행 잘 됩니다.
예제를 실행한 프로젝트를 같이 올리니 직접 테스트해보세요.
예제 코드가 아니라 본인이 작성한 코드에서 오타가 있을 겁니다.
문의한 컴파일러 경고는 무시하면 됩니다.
해당 경고는 malloc 함수가 반드시 성공하는 함수가 아니라서 표시되는 것이니 무시하면 됩니다. 시스템 메모리가 부족해서 메모리 할당이 실패한 경우에는 malloc에 NULL을 반환하니까 NULL 체크를 하라는 것입니다.
malloc 호출 후에서 if( m != NULL ) 같은 코드를 작성하라는 것입니다. 다만, 예제는 핵심 코드를 보여주는 게 중요하므로 예외 처리를 무시하고 작성하는 경향이 있습니다. 이는 대다수 책에 적용되는 공통 사항입니다.