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];
두개의 차이가 뭘까??
-배열의 이름이 시작주소로 시작되면 그 값을
변경할 수 없다.
-배열로 시작하면 밑에서 치환이 불가하다.
-배열의 크기를 수정하고 싶다면 배열로 선언하면 안되고 포인터를 사용하여야 한다.
'프로그래밍 > 자료구조' 카테고리의 다른 글
자료구조 공부하기 추상 데이터 타입 (0) | 2016.12.30 |
---|---|
자료구조 공부하기 자료구조란? 알고리즘이란? (0) | 2016.12.30 |
자료구조 메모리,포인터,변수 예제 (0) | 2016.12.30 |
문자열 (0) | 2016.12.30 |
문자열을 입력받아 문자열의 길이를 출력해보는 코드 (0) | 2016.12.30 |