2008. 11. 13. 14:31

메모리 관리와 동적 할당.. C

1. 메모리의 구성.

 0(주소)                                                                                                                          216                               220  

                                       

 |<-----------data----------------> |<-------------heap-------------->|<----------------stack----------------------->|

                                   first in last out(FILO) 

data 영역 : 전역변수, 함수코드,....
heap 영역: 사용하지 않음, 동적할당 영역
stack 영역:지역변수..AUTO변수(생략가능).
 

2.프로그램 흐름과 메모리 

void sub(int);
int n=100;                 //전역변수
double d= 56.7;        //전역변수

int main()
{
   int a=20;
   sub(a);
}

void sub(int x)
{
  int k = x;
}

0       DATA

   n=100
   d=56.7
 

 HEAP

  
  
 

 STACK

 

   k=20 

  int k 선언시 생김

   x=20

sub(a)가 실행 되는순간 생김

   a=20

1000
 
메모리 공간 반납 순서

k -> x -> a-> n ->d

 레지스터는 스텍 포인터를 저장하고 있는 게 있다..
 

3.메모리 동적 할당.

memory all location(malloc)

 정상 수행: 첫번째 주소 리턴

 실       패: NULL포인터 리턴

 void* malloc(size_t size)
 메모리 해제.  void free(void* ptr)

size_t 는 unsigned int 를 재정의 

double* d=(double*)malloc(sizeof(double));
                                       --------------
                                       시스템에 따라 자료형드링 차이 나기때문에 프로그램 보수유지를 위해서 
                                       sizeof사용
  void *d;
     *d=4.5는 불가능하다.. 자료형이 없기때문에 불가능하다 
                                   d에가서 몇바이트를 할당(참조) 할지 모르므로 안된다
                                   그러므로 강제 형변환을 해야한다..

   d

 350

 |
 |  
▼ 

350

 
 
 

   HEAP

 
void 포인터는 잠깐 주소 저장가능 하지만 *를 사용해서 참조 불가능
이유는 그 주소로 가서 몇바이트를 읽어야하는지 모르기 때문에 그래서 자료형에 대한 정보가  필요하다.


//malloc.c

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

int main()
{
 double* d=(double*)malloc(sizeof(double));

     *d=99.9;

 printf(" *d = %2lf , d = %d , addr = %d \n",*d,d,&d);
 printf(" size d = %d , *d = %d byte \n",sizeof(d),sizeof(*d));

 free(d);

 return 0;
}