티스토리 뷰

728x90

1. malloc 
    - memory allocation
    - 원형 함수 : void *malloc(unsigned int);
    - 할당된 공간의 값들은 바꾸지 않음
    - 리턴값은 할당된 주소
    - 예시

 

2. calloc
    - clear allocation
    - 원형 함수 : void *calloc(unsigned int, unsigned int);
    - 첫번째 인자는 배열요소의 갯수, 두번째 이자는 할당받을 공간의 크기
    - 할당된 공간의 값들을 0으로 초기화
    - 리턴값은 할당된 주소
    - 예시

메모리 할당 시 힙 영역에 문제가 있으면 NULL(0)을 리턴 -> 호출 후 확인 필요

3. realloc
    - resize allocation
    - 원형 함수 : void *realloc(void *, size_t size);
    - 동적 메모리의 재할당
    - 리턴값은 재할당된 주소(재변경시 메모리(힙)공간의 문제로 다른 위치에 변경될 수도 있다)
    - 예시

 

4. 함수내에서 realloc(malloc) 주의점 !! 
    -  void fun_realloc(char *arr)와 같이 단일 포인터를 파라메타로 전달 시 함수내에서 할당된 위치가 변경되면 문제가 생길수 있다. 그렇기 때문에 void fun_realloc(char **arr)와 같이 2중 포인터를 이용하여 접근한다.


    - 함수 결과

    *arr = (char *)realloc(arr, 10 * sizeof(char));에서  '='을 기준으로 왼쪽 *arr은 arr의 value인 힙의 데이터 주소의 첫번째 데이터의 value이다. 즉 값 a가 저장되어 있는 char 자료구조에 a 대신 '='의 오른쪽의 재할당한 공간의 시작주소를 넣는다. 그래서 a가 깨진다. 위 사진을 볼때 b값도 깨지는데 포인터 주소의 크기는 4byte이고 char 1byte라 같이 깨진것이다. 만약 수치가 더 큰 주소였다면 b이상의 데이터도 깨졌을 것이다.


    - 사용자가 지정한 위치에서부터 변경할 크기만큼 할당을 못할 시 다른 위치에 새롭게 할당
        ->>함수 내에서 realloc사용시 위 상황이 발생했다면 문제 발생

- 함수가 끝나면서 새로 할당받고 데이터가 추가되어 있는 메모리 주소를 arr(Main)이 알 수가 없음
         ->> 결국 할당 크기 및 데이터가 변경되어 있지 않음


- 해결방법
    이중 포인터를 이용한 함수를 만든다.

 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함