메모리 관리와 동적 할당.. C
1. 메모리의 구성.
|<-----------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;
}
'C# .NET' 카테고리의 다른 글
깡통 개발자의 C# 익히기 -제 2강- (.NET FRAMEWORK) (0) | 2008.11.14 |
---|---|
깡통 개발자의 C# 익히기 -제 1강- (C#의 특징) (0) | 2008.11.14 |
메모리(힙과 스텍, 데이터영역)의 이해 (0) | 2008.11.13 |
클래스 기초 & 속성 (0) | 2008.11.07 |
클래스 기초 & 메서드 (0) | 2008.11.07 |