-Part3- 제 4 장동적메모리할당과가변인 자
학습목차 4.1 동적메모리할당
4.1 동적메모리할당
4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성
4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역 데이터영역 : 전역변수, 정적변수들이저장되는영역 힙영역 : 프로그램이실행되는동안동적으로메모리를할당할수있는영역
4.1 동적메모리할당 (2/6)---[4-1.c 실습 ] #include <stdio.h> int a=10; int main(void) { int num1=10, num2=20; static int s=20; // 전역변수 a 선언 // 지역변수 num1, num2 선언 // 정적변수 s 선언 printf(" 데이터출력 : %d %d %d %d \n", a, num1, num2, s); printf(" 코드영역 : %x %x \n", main, printf); // 함수이름 printf(" 스택영역 : %x %x \n", &num1, &num2); // 지역변수 printf(" 데이터영역 : %x %x \n", &a, &s); // 전역변수, 정적변수 } return 0;
4.1 동적메모리할당 (3/6) 동적메모리할당 힙영역에할당된다. 런타임중 ( 실행시간 ) 에이루어진다. 프로그래머가동적메모리할당을요구한다.
4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성
4.1 동적메모리할당 (4/6) 동적메모리할당이필요한이유 1. 선언된배열요소의수가사용된요소수보다많은경우 ( 메모리낭비 ) int array[5]; // 선언된배열요소수 : 5개 (20바이트) array[0]=10, array[1]=20, array[2]=30; // 사용된배열요소수 : 3개 (12바이트) 2. 선언된배열요소의수가사용된요소의수보다적은경우 ( 메모리부족 ) int array[2]; // 선언된배열요소수 : 2개 (8바이트) array[0]=10, array[1]=20, array[2]=30; // 사용된배열요소수 : 3개 (12바이트)
4.1 동적메모리할당 (5/6) 동적메모리할당이필요한이유 3. 배열선언시배열길이에변수를설정한경우에러발생 int a=5; int array[a] // 배열선언시배열 a 를배열길이로사용 void init(int a) { int array[a]; // 배열선언시함수의인자 ( 지역변수 ) a 를배열길이로사용 결롞 : 프로그래머가필요한메모리크기를예측할수없다. 따라서 동적메모리할당의필요하다.
4.1 동적메모리할당 (6/6) 동적메모리할당함수와해제함수 헤더파일 : stdlib.h 종류함수성공실패 메모리할당함수 메모리할당함수 메모리할당함수 메모리해제함수 #include <stdlib.h> void* malloc (size_t size) #include <stdlib.h> void* calloc (size_t num, size_t size) #include <stdlib.h> void* realloc (void* p, size_t size) #include <stdlib.h> void free (void* p) 할당된메모리의시작주소반환 할당된메모리의시작주소반환 재할당된메모리의시작주소반환 NULL 반환 NULL 반환 NULL 반환 할당된메모리해제 -
4.2 동적메모리할당함수, 해제함수그리고가변인자
4.2 동적메모리할당함수, 해제함 배울내용 수그리고가변인자 1 malloc( ) 함수와 free( ) 함수 2 calloc( ) 함수와 free( ) 함수 3 realloc( ) 함수와 free( ) 함수 4 가변인자
(1/22) malloc( ) 함수와 free( ) 함수 종류함수성공실패 메모리할당함수 void* malloc(size_t size); 할당된메모리의시작주소반환 NULL 반환 메모리해제함수 void free(void* p); 할당된메모리해제
(2/22) malloc(4) 함수를이용한동적메모리할당
(3/22) 할당된메모리의시작주소형변환 (int*)
(4/22) free( ) 함수를이용한동적메모리해제
(5/22) #include<stdio.h> #include<stdlib.h> int main(void) { int* p=null; 6행 p = (int*)malloc(4); [4-2.c 실습 ] if(p==null) printf(" 힙영역에동적메모리할당실패 \n"); 11행 15행 16행 } *p = 10; printf(" 주소 : %x \n", p); printf(" 값 : %d \n",*p); free(p); p = NULL; return 0;
(6/22) 동적메모리할당 ---[4-2.c 분석 ]
(7/22) [4-3.c 실습 ] #include<stdio.h> #include<stdlib.h> int main(void) { char* p1 = (char*)malloc(2); int* p2 = (int*)malloc(8); p1[0] = 'A'; // *(p1+0) = 'A'; p1[1] = 'B'; // *(p1+1) = 'B'; p2[0] = 10; // *(p2+0) = 10; p2[1] = 20; // *(p2+1) = 20; printf(" 주소 : %x %x %x %x \n", &p1[0], &p1[1], &p2[0], &p2[1]); printf(" 값 : %d %d %d %d \n", p1[0], p1[1], p2[0], p2[1]); free(p1); p1 = NULL; } free(p2); p2 = NULL; return 0;
4.2 동적메모리할당함수, 해제함 수그리고가변인자 배울내용 1 malloc( ) 함수와 free( ) 함수 2 calloc( ) 함수와 free( ) 함수 3 realloc( ) 함수와 free( ) 함수 4 가변인자
(8/22) calloc( ) 함수를이용한동적메모리할당 종류함수반환값 메모리할당함수 void* calloc(size_t num, size_t size); 성공 : 할당된메모리의시작주소반환실패 : NULL 반환 calloc( ) 함수와 malloc( ) 함수와의차이
(9/22) [4-4.c 실습 ] #include <stdio.h> #include <stdlib.h> int main(void) { int i=0; int* p=(int*)calloc(sizeof(int), sizeof(int)); if(p==null) printf(" 힙영역에동적메모리할당실패 \n"); for(i=0; i<4; i++) { p[i]=i; // *(p+i)=i; printf(" 주소 : %x \n", &p[i]); printf(" 값 : %d \n", p[i]); } free(p); p=null; } return 0;
(10/22) #include <stdio.h> #include <stdlib.h> int main(void) { int* p1=( int*) calloc(1, sizeof(int)); int* p2=(int*) malloc(4); [4-5.c 실습 ] printf("p1 값 : %d \n", *p1); printf("p2 값 : %d \n", *p2); free(p1); p1=null; free(p2); p2=null; } return 0;
4.2 동적메모리할당함수, 해제함 수그리고가변인자 배울내용 1 malloc( ) 함수와 free( ) 함수 2 calloc( ) 함수와 free( ) 함수 3 realloc( ) 함수와 free( ) 함수 4 가변인자
(11/22) realloc() 함수를이용한동적메모리재할당 malloc( ), calloc( ) 함수는동적메모리를할당후메모리변경불가 realloc( ) 함수로해결 종류함수반환값성공 : 재할당된메모리의메모리할당함수 void* realloc(void* p, size_t size); 시작주소반환실패 : NULL 반환
(12/22) #include <stdio.h> #include <stdlib.h> int main(void) { int i=0; int* p=(int*) malloc(sizeof(int)*2); p[0]=10; p[1]=20; p=(int*) realloc(p, sizeof(int)*4); p[2]=30; p[3]=40; for(i=0; i<4; i++) printf("p[%d] : %d \n", i, p[i]); [4-6.c 실습 ] } free(p); p=null; return 0;
(13/22) [4-7.c 실습 ] #include <stdio.h> #include <stdlib.h> int main(void) { int i=0; int* p=(int*) malloc(sizeof(int)*2); p[0]=10; p[1]=20; p=(int*) realloc(p, sizeof(int)*1); p[0]=30; for(i=0; i<2; i++) printf("p[%d] : %d \n", i, p[i]); } free(p); p=null; return 0;
(14/22) 메모리영역의특징 특징 코드, 스택, 데이터영역 힙영역 메모리할당 컴파일시간에할당 런타임시간 ( 실행시간 ) 에할당 메모리해제 자동해제 free() 함수로해제 메모리관리 컴파일러 프로그래머
4.2 동적메모리할당함수, 해제함 수그리고가변인자 배울내용 1 malloc( ) 함수와 free( ) 함수 2 calloc( ) 함수와 free( ) 함수 3 realloc( ) 함수와 free( ) 함수 4 가변인자
(15/22) 가변인자 함수의인자수를고정하지않는다. void add(int num, );
9 행 10 행 11 행 15 행 (16/22) [4-8.c 실습 ] #include <stdio.h> void add (int num,...); int main(void) { int a=10, b=20, c=30; // 가변인자함수선언 add(1, a); // 가변인자함수호출 1 add(2, a, b); // 가변인자함수호출 2 add(3, a, b, c); // 가변인자함수호출 3 return 0; } void add(int num,...) { int* p=null; p=&num+1; // 가변인자함수정의 } if(num==1) printf("%d \n", p[0]); else if (num==2) printf("%d \n", p[0]+p[1]); else printf("%d \n", p[0]+p[1]+p[2]); // 10 출력 // 30 출력 // 60 출력
(17/22) add(1, a) 함수의호출 add(2, a, b) 함수의호출
(18/22) add(3, a, b, c) 함수의호출
(19/22) num==1 인경우 [4-8.c 분석 ]
(20/22) num==2 인경우 [4-8.c 분석 ]
(21/22) [4-8.c 분석 ] num==3인경우