C 동적할당 어째서 free() 로 해제한 메모리를 수정하거나 접근할수 있는건가요?

조회수 749회
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *pList = NULL, i = 0;

    pList = (int*)malloc(sizeof(int) * 3);

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

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

    free(pList);

    printf('\n ********** \n');

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

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

    return 0;
}

이번에 동적할당 공부하면서 궁금한게 생겼는데요.

여기 free() 에서 동적할당을한 메모리를 해제해서 운영체제에 돌려준다고 설명이 나와있던데

어떻게 해제한 후에도 그 값을 수정하거나 접근할수 있는건가요?

해제했다면 아예 그값에 접근하지 못하거나 없어야 하지 않나요??

  • 댕글링 포인터! 김호원 2020.9.2 17:30

2 답변

  • malloc으로 메모리를 할당 받았다가 free로 해제하는데요.

    예를 들어, malloc으로 10바이트를 할당 받았는데, 이 때, 다시 한번 malloc으로 20바이트를 할당 받으면 두 메모리는 겹치지 않습니다.

    그런데 만약 malloc으로 10바이트를 먼저 할당 받고, 그 후 free로 그 메모리를 해제한 후, 다시 malloc으로 메모리를 할당 받으면 이 경우에는 방금 전 free로 해제한 메모리의 일부 또는 전부를 할당 받을 수도 있습니다.

    결국 free는 다시 malloc으로 할당 받을 수 있게 해제하는 역할이라고 생각하시면 됩니다.

    보통 운영체제 같은 과목에서 프로세스 이미지라는 것을 배울수 있는데요. malloc 함수가 할당 받는 메모리는 프로세스 이미지 중의 힙 영역의 메모리입니다.

    질문 코드에서 보면

    free(pList);
    pList[0] = 10;
    

    해제 했는데도 불구하고 읽을 수 있는 것은 물론, 심지어는 변경도 가능하네요.

    그래서 보통 free를 사용한 후에 NULL을 입력합니다.

    free(pList);
    pList=NULL;
    

    그러면 더이상 pList[0] = 10;는 동작하지 않게 되겠지요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 다시 접근하지 못하게, 여기는 free 한 메모리 부분이다라고 표시해 놓는 게 비싸니까요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)