본문 바로가기

프로그래밍/[C]

[C]포인터반환, 스택영역 힙영역

포인터를 파라미터로 주고 받을때 주의할 점들이다.

 

이런 함수가 있다고 치자

int* func1( )

{

    int array[20] = {1, };//참고로 array에는 1,0,0,0,....이 들어간다

    

    return array;

}

위의 경우 array는 stack영역에 저장되며 컴파일 타임에 메모리가 할당된다.

array라는 포인터는 array[0]의 주소값을 가지고 있다.

 

이 array라는 값을 리턴해 버리면 array[0]의 주소는 받을수 있다. 

하지만 사실 array라는 값은 함수의 스택을 가리키므로 잘못된 사용이다.

지역변수의 주소값을 반환해버리는건 잘못된 사용이다

스택이라는 것이 compile타임에 많이 결정된다고 하지만 실제로는  사이즈등은 runtime 에도 운영체제나 환경에 따라 바뀐다.

 

int* func2( )

{

    int* array_malloc = (int*)malloc(sizeof(int)*20);

 

    return array_malloc;

}

array_malloc변수 자체는 스택에 있지만

array_malloc가 가리키는 곳은 힙영역 임으로

주소값을 받아버리면 사용 할 수 있다. 하지만 메모리를 할당하면  free로 해제해 줘야 한다.

 

따라서 array_malloc의 값을 받은 포인터 변수를 사용하다가 다쓰고 free해주면 된다.

 

참고로 free라 함은 할당된 메모리를 해제하여 운영체제에게 해당 메모리는 사용 가능 하다고 알려주는 것이다.

위에서 free(array_malloc)을 하면 sizeof(int)*20 크기의 메모리가 해제가 된다. 

 

array_malloc에는 어떤 정보가 있길래 sizeof(int)*20 크기만큼 메모리를 해제 하는걸까(?)

 

 array_malloc을 통해 200번지의 주소를 배정 받았다 치자, 그러면 200번지 이전의 192번지 부터는 allocation된 크기정보 등이 담겨져 있다. 이를 통해 메모리를 운영체제가 해제해준다.

추가로 free를 연속으로 두번 해주면 중복해제라고 오류가 나며

free(array_malloc)에서 array_malloc의 value를 free해줘도 해제 가능하다.

 

관련 내용으로 질문했던 전문이다. 

https://stackoverflow.com/q/61314257/13358301