본문 바로가기

프로그래밍/자료구조

동적 메모리 할당


http://blog.naver.com/wlsgkr91/220895953442



동적 메모리 할당

변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 

이것을 "동적 메모리 할당" 이라고 한다.


Malloc 함수를 호출하여 동적메모리 할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다. 


10개의 정수를 저장하기 위한 메모리 공간이

필요하다. 

int *p; 

p=(int *)malloc(40);     

if(p==NULL){ 

  //동적 메모리 할당이 실패 

  //적잘한 조치를 취한다. 


P[0]=12; 

P[1]=24; 

*(P+2)=36; 


int *

-malloc이 반환하는 주소는 타입이 없는 주소 void * 이다.

-정수들을 저장하기 위해서 이것을 int *로 

변환한다. (반드시 필요한 건 아니다.)

malloc(40)

-할당받을 메모리의 크기를 byte단위로 지정한다. 여기서는 10개의 정수를 저장하기 위해서 40 byte를 요청하였다. 


메모리 주소를 보관하기 위해서 어떤 변수에

저장해야하는데 메모리 주소를 저장해둘 수 있는 포인터 변수 p에 저장한다. 

따라서 malloc이 리턴해주는 메모리 주소를 

p에 보관한다. 


만약 나의 목적이 할당 받은 메모리에

정수들을 저장하는 것이라면 그 주소를 

정수형 포인터로 변환한다.

(int *)-타입 변환이 반드시 필요한건 아니다.  

(char*)-문자를 저장하는 메모리가 필요하다면 형변환.


if문을 통과했다면 정수형 배열처럼

쓸 수 있다.

따라서 P를 정수형 배열인 것 처럼 쓸 수 있다.

동적 메모리 할당 활용 - 배열 키우기.


동적으로 할당된 배열은 공간이 부족할 경우 

더 큰 배열을 할당하여 사용할 수 있다. 


int * array=(int *)malloc(4*sizeof(int));//16byte 

  array[0]=1; 

  array[1]=2; 

*(array+2)=3; 


//배열의 크기가 부족한 상황이 발생한다면 밑에있는 코드로 확장. 


int * tmp= (int *)malloc(8*sizeof(int)); 

int i; 

for (i=0;i<4;i++) 

 tmp[i]=array[i]; 


array =tmp;

sizeof(int)

-정수형이 얼마나 크기를 가지고 있느냐.

int형은 4 byte의 크기의 정수를 가질 수 있다.

-molloc은 sizeof(연산자)를 사용하면 코드의 호환성이 좋아진다. 


int * tmp= (int *)malloc(8*sizeof(int));

-크기가 8인 동적메모리를 tmp라는 변수에

저장.

for (i=0;i<4;i++) 

 tmp[i]=array[i];

-원래 있던 array의 저장되어있던 데이터를 tmp라는 변수로 이동.

array=tmp; 

array가 포인트 변수이다 

16바이트의 메모리 공간의 시작 주소를 저장. 

tmp는 32바이트의 메모리 공간의 시작 주소를 저장.

포인터 변수간의 치환도 보통 변수간의 치환과 같다. tmp는 32바이트의 메모리 공간의 시작 주소를 저장.



처음 array가 처음 할당 받았던 16 byte는

사라지지 않고 쓰지 않는 공간이 된다.

필요 이상의 메모리가 된다.


-int * array=(int *)malloc(4*sizeof(int)); 

-int array[4];

두개의 차이가 뭘까??

-배열의 이름이 시작주소로 시작되면 그 값을

변경할 수 없다.

-배열로 시작하면 밑에서 치환이 불가하다.

-배열의 크기를 수정하고 싶다면 배열로 선언하면 안되고 포인터를 사용하여야 한다.