int** pnt = malloc(sizeof(int) * row);
pnt[i] = malloc(sizeof(int) * row);
(도장_ 관리자님이 수정함 - 원문 제출일: 2020년 3월 14일, 토요일, 오후 10:26)
malloc으로 메모리를 할당하면 쓰레기 값이 들어 있습니다.
이에 대해서는 이전 답변을 참고하세요.
https://dojang.io/mod/forum/discuss.php?d=1184&parent=2684
UNIT 38.3을 보면 포인터에 할당된 메모리를 2차원 배열처럼 사용하기를 설명합니다. UNIT 38.7은 이를 이해했는지 확인하는 문제입니다.
문의한 코드는 Visual Studio에서는 동작하는 것처럼 보이지만,
실제 검토를 해보면
bash: line 1: 13 Segmentation fault (core dumped) ./a.out이와 같은 문제가 발생합니다. Segmentation fault는 메모리 사용을 잘못했다는 뜻입니다.
문의한 코드를 보면 다음과 같습니다.
int** pnt = malloc(sizeof(int) * row);
UNIT 38.3의 pointer_like_two_dimensional_array.c에는 다음과 같습니다.
int **m = malloc(sizeof(int *) * 3);
사용하는 환경에 따라 int와 int*의 크기는 같을 수도 있고, 다를 수도 있습니다.
예를 들어 32비트 환경에서는 대부분
- int = 4바이트
- int * = 4바이트
입니다.
그러나 오늘날 대부분은 64비트 환경을 사용합니다. 윈도 10은 64비트 환경이 대부분이고, 리눅스, macOS도 대부분 64비트 환경을 사용합니다. 32비트 환경은 의도적으로 골라서 32비트 환경으로 사용해야 하는데, 이 경우 하드웨어적으로 최대 4GB의 메모리만 사용할 수 있습니다.(2의 32승 최댓값이 4GB입니다).
스마트폰도 메모리가 6GB, 8GB씩 장착되어 있습니다. 이는 스마트폰도 대부분 64비트 환경이라는 뜻입니다.
대부분의 64비트 환경에서는
- int = 4바이트
- int * = 8바이트
입니다.
메모리 조작을 32비트 단위로 하느냐, 64비트 단위로 하느냐입니다.(하드웨어적으로는 대부분은 64비트 환경에서 64비트까지 사용하지는 않고, 보통은 48비트 정도까지만 사용합니다. 64비트는 최대 엑사바이트 단위까지 메모리를 사용할 수 있지만, 현재 그런 하드웨어 사양이 존재하지 않기 때문에 효율을 위해 48비트 정도를 CPU에서 지원하고 있습니다. 이런 내용은 <컴퓨터 구조론>을 공부하면 자세히 배우게 됩니다. 물론, 옛날 책이 아니라 최신 개정판으로 적절하게 업데이트된 교재를 봐야 합니다)