인프런 커뮤니티 질문&답변

밑바닥개발자님의 프로필 이미지
밑바닥개발자

작성한 질문수

독하게 시작하는 C 프로그래밍

동적 할당 메모리 질문

해결된 질문

작성

·

140

0

안녕하세요! 현재 강사님의 동적 할당 메모리 강의에서 아래 예제 소스코드를 파헤쳐보고 있는데요!

 

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int* pList = NULL;
    pList = (int*)malloc(sizeof(int) * 3);

    pList[0] = 10;
    pList[1] = 20;
    pList[2] = 30;

    for (int i = 0; i < 3; ++i) {
        printf("%d\n", pList[i]);
    }

    free(pList);
    return 0;
}

그런데 디버그 모드로 실행하면서 메모리 뷰를 보고 있는데, 잘 이해가 되지 않는 지점이 있어 질문드립니다.

(제가 개인적으로 MacOS를 사용해서 CLion 이라는 IDE를 쓰긴하는데, 강의 속 visual studio 처럼 메모리 뷰를 보는 기능은 동일하게 제공해주어서 제가 사용하는 IDE 첨부사진인 점 양해 부탁드리겠습니다 (__) )

 

우선 break point를 아래처럼 라인 바이 라인으로 설정한 후 하나씩 실행해보고 있는데요. 한 step 씩 사진을 첨부하면서 설명을 하겠습니다.

1.정수 포인터 변수인 pList 에 주소 연산자(&)을 써서 "정수 포인터 변수의 메모리 주소"를 확인

=> 64비트 운영체제 컴퓨터에서 포인터 변수는 8바이트(64비트) 크기를 차지하기에 이것은 이해가 됩니다

스크린샷 2024-08-06 오후 9.31.13.png2.정수 포인터 변수인 pList를 메모리 윈도우에서 확인

=> 이 부분이 명확히 잘 이해가 가지 않습니다. 일단 pList를 메모리 윈도우에 입력했을 때 pList가 '정수' 타입으로 선언했기 때문에 사진 속 초록색 영역이 4바이트(32비트) 크기인 것은 알겠는데, 초록색 영역에 들어있는 "ff c3 00 d1" 은 의미가 무엇인가요..? 사실 근본적으로 pList가 정수 포인터 변수인 것은 알겠는데, 메모리 윈도우에 pList 를 입력했을 때랑 &pList 입력했을 때의 차이가 명확하게 무엇인지 스스로에게 설명을 못하겠습니다..

스크린샷 2024-08-06 오후 9.31.24.png3.다음 break point로 한 step 실행한 뒤, pList에 주소 연산자(&)를 써서 메모리 윈도우를 확인

=> 소스코드에서 pList에 NULL을 할당했기 때문에 아래 사진 속 메모리 윈도우에서 빨간색으로 변한 영역이 0으로 변한 것은 이해가 갑니다.

스크린샷 2024-08-06 오후 9.31.38.png4. 3번 단계에서 메모리 윈도우에서 pList를 입력한 후 확인

=> 이 부분도 잘 모르겠습니다. pList를 메모리 윈도우에 입력하니까 failed to read memory 메세지가 뜨면서 메모리를 읽지 못한다는 문제가 발생했는데, 왜 읽지 못하는 것인지.. 이해가 가질 않습니다.

스크린샷 2024-08-06 오후 9.31.45.png5. 다음 break point로 한 step 실행한 뒤 pList를 메모리 윈도우에 입력한 후 확인

=> 소스코드에서 malloc() 함수가 정의되어 있는 라인이 실행된 후에야 4번에서 발생한 문제가 사라지더라구요. 4번에서 발생한 문제의 원인을 모르니 5번에서 왜 문제가 해결되었는지도 연쇄적으로 잘 이해가 가지 않네요..

스크린샷 2024-08-06 오후 9.32.27.png

혹시 위 5개 단계에서 제가 질문한 부분에 대해 답변 가능하신지 여쭙습니다. 동일한 visual studio 환경이 아니라 죄송합니다 ㅠ 천천히 답변주세요! 기다리겠습니다 🙂

답변 3

1

하루 동안 고민해보았는데.. 자문자답 합니다. 강사님 강의처럼 직접 2차원으로 메모리를 그려보면서 해보니까 이해가 되네요! 제가 질문드린 것 중 2번 단계에서 메모리 뷰에 pList 와 &pList 를 입력했을 때의 차이는 다음과 같다는 생각입니다.

ㄴ pList 를 메모리 뷰에 입력 : "pList 라는 정수 포인터 변수가 가리키는 데이터"

ㄴ &pList를 메모리 뷰에 입력 : "pList 라는 정수 포인터 변수에 담겨있는 데이터(메모리 주소)"

그리고 4번 단계에서 메모리 뷰에 pList를 입력하니까 Failed to load memory 가 발생한 이유는 pList 라는 포인터 변수를 NULL로 할당해서 pList 포인터 변수에 담겨있는 데이터 즉, 메모리 주소가 모두 0으로 초기화되었고, 결국 0x0000000000000000 주소가 되는데, 해당 주소를 갖는 메모리는 존재하지 않기 때문에 발생한 거였습니다!

그림 그린 부분도 참고차 남깁니다. 혹시 제가 이해한 것 중 잘못된 부분을 보신다면 적극 답글 남겨주셔도 감사하겠습니다!

< 2번 단계에서의 메모리 상황 >

다운로드 (1).png

 

< 4번 단계에서의 메모리 상황 (Failed to load memory 발생하는 상황) >

다운로드 (2).png

 

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

와우~~! 스스로 답을 찾는 수준에 진입하셨군요! 잘 해내셨습니다. 😄

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

관리용 댓글입니다. :)

0

안녕하세요, 인프런 AI 인턴입니다.

밑바닥개발자님의 질문에 답변드리자면, 동적 할당 메모리와 관련하여 제공해주신 상황 설명은 매우 자세하고, 질문의 핵심을 잘 짚고 계십니다. malloc 함수 사용과 관련하여 메모리 할당 및 주소 확인 과정에서의 궁금증이 매우 구체적이네요.

제공해주신 맥락에서 직접적인 문제 해결로 연결되는 특정 답변을 소개하진 않지만, malloc 함수와 메모리 할당, 주소 확인 과정에 대해서 어느 정도 이해의 도움이 될만한 내용을 제공해드리겠습니다.

  1. malloc 함수의 형변환(?) 질문드립니다!: malloc 함수의 형변환(?) 질문드립니다! 여기서는 malloc 함수 사용 시, 앞에 붙는 자료형*에 대한 의문을 해결해 줍니다. 여기서 설명된 형변환의 개념은 malloc로 할당된 메모리의 주소값이 해당 자료형의 포인터로 변환되어 사용되는 이유와 방식을 설명합니다.

동적 메모리 할당과 관련된 내용이기는 하나, 밑바닥개발자님의 구체적인 상황과는 직접적으로 매치되는 답변은 아닐 수 있습니다. 하지만 malloc의 기본적인 사용 방법과 메모리 할당 후의 주소값 처리 방식에 대한 이해에 도움이 될 것입니다.

질문에 대한 구체적인 답변으로 인도하기 어렵지만, 동적 메모리 할당에서 메모리 뷰를 확인하면서 발생한 궁금증을 해결하는 데 조금이나마 도움이 될 수 있는 기본적인 형변환과 malloc 사용법에 대한 이해는 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

밑바닥개발자님의 프로필 이미지
밑바닥개발자

작성한 질문수

질문하기