제14장 동적 메모리 할당
Dynamic Allocation void * malloc(sizeof(char)*256) void * calloc(sizeof(char), 256) void * realloc(void *, size_t); Self-Referece NODE struct selfref { int n; struct selfref *next; }; Linked List struct linked_list { char *name; struct linked_list *next; }; typedef struct linked_list NODE; typedef NODE * LINK ; 한밭대정보통신공학과 и чунг хо 2
스택영역 ( 형식매개변수, 지역변수 ): 작은주소값 데이터영역 ( 전역변수, 정적변수 ): 중간주소값 Heap 영역 ( 동적할당변수 ): 큰주소값영역 동적메모리할당은 Heap 영역에대량의메모리를확보 #include <stdlib.h> // 포함시켜야할헤더 void *malloc(sizeof(data type)* 개수 ); void *calloc( 개수,sizeof(data type)); void *realloc(void *, size_t); 한밭대정보통신공학과 и чунг хо 3
void *malloc(sizeof(data type)* 개수 ); int a[5]={0,1,2,3,4}; 위와같은것을 malloc() 으로같은효과를주려면 int *pi, i; pi = (int *) malloc(sizeof(int)*5); for(i=0;i<5;i++) pi[i]=i; free(pi); 한밭대정보통신공학과 и чунг хо 4
//1 에서 6 까지의주사위값으로생성하는프로그램 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int *p, n, i; printf("input n: "); scanf("%d", &n); p=(int *)malloc(sizeof(int)*n);// 입력 n 크기만큼동적배열생성 srand(time(null)); // 실행시마다다른결과가나타나도록함. for(i=0;i<n;i++) printf("%1d ", rand()%6+1); // 랜덤한주사위값이나오도록함. return 0; } 한밭대정보통신공학과 и чунг хо 5
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int **p, rows, cols, i,j; printf("input rows cols: "); scanf("%d%d", &rows, &cols); p=(int **)malloc(sizeof(int *)*(rows+1)); // 각행의포인터수만큼확보 for(i=0;i<rows;i++) p[i]=(int *)malloc(sizeof(int)*cols);// 각행의원소의수만큼 p[i]=null; //row+1의 1에해당하는부분의마지막을 NULL로채움. srand(time(null)); // 실행시마다다른결과를내도록함. for(i=0;i<rows;i++) for(j=0;j<cols;j++) p[i][j]= rand()%10; //0에서 9까지의랜덤한수로채움. for(i=0;i<rows;i++){ // 프린트하는부분 for(j=0;j<cols;j++) printf("%2d ", p[i][j]); printf("\n"); } 한밭대정보통신공학과 и чунг хо 6
void *calloc( 개수,sizeof(data type)); calloc() 은 0 으로초기화시키고, malloc() 보다속도가빠르다. int a[5]={0,1,2,3,4}; 위와같은것을 calloc() 으로같은효과를주려면 int *pi, i; pi = (int *) calloc(5, sizeof(int)); for(i=0;i<5;i++) pi[i]=i; free(pi); 한밭대정보통신공학과 и чунг хо 7
void *realloc(void *, size_t); // 초기화 0 으로안됨 int *pi, *repi, i; pi = (int *) calloc(5, sizeof(int)); for(i=0;i<5;i++) pi[i]=i; //0 1 2 3 4 repi = (int *)realloc(pi, 7*sizeof(int)); for(i=5;i<7;i++) pi[i]=i; //5 6 free(pi); 한밭대정보통신공학과 и чунг хо 8
데이터와포인터를포함하는구조체 포인터가다름구조체를가리키도록함 형태 struct selfref { int data; struct selfref *next; }; typedef struct selfref list; 한밭대정보통신공학과 и чунг хо 9
데이터와포인터를포함하는구조체 first = (list *)malloc(sizeof(list)); second = (list *)malloc(sizeof(list)); first->data = 100; second->data = 200; second->next = NULL first->next = second; 한밭대정보통신공학과 и чунг хо 10
자기참조구조체이용 헤드 : 연결리스트의첫번째원소, 마지막원소는 NULL 형태 struct LikedList { char *str; struct list *next; }; typedef struct LinkedList NODE; typedef NODE *LINK; 한밭대정보통신공학과 и чунг хо 11
LINK cur; char str[] = C++ ; // 복사해넣을내용 cur = (NODE *)malloc(sizeof(node)); cur->str =(char*)malloc(sizeof(char)*(strlen(str)+1)); strcpy(cur->data, str); // 문자열을데이터에복사 cur->next = NULL; //append 할것이므로항상맨마지막이됨. 다른노드를연결하려면다른구조체를가리키도록대입하면됨. 한밭대정보통신공학과 и чунг хо 12
자기참조구조체를한개만들고이를 cur 라한다. Append() 라는함수를이용하여데이터가없으면맨앞에추가한다. 이미다른데이터가있으면연결리스트의끝을찾아서맨뒤에추가한다. 마지막노드를찾아가는방법 LINK nextnode = head; if(head==null) // 연결리스트에노드가없으면추가 { head = cur; return head; } 한밭대정보통신공학과 и чунг хо 13
연결리스트에노드가있으면 while (nextnode->next!=null) // { nextnode = nextnode->next; } nextnode->next = cur; 한밭대정보통신공학과 и чунг хо 14
#include <stdio.h> int main() { printf(" 경로 : %s\n", FILE ); printf(" 컴파일시각 :%s\n", TIME ); printf(" 컴파일년월일 :%s\n", DATE ); printf(" 줄번호 : %d\n", LINE ); return 0; } 한밭대정보통신공학과 и чунг хо 15
운영체제등의환경이다를때손쉽게이를맞춰주려고할때사용 #if SYSTEM == WINDOWS #include stdio.h #elif SYSTEM == MAC //else if 의의미 #incude vax.h #elif SYSTEM == UNIX #include unix.h #else #include etc.h #endif 한밭대정보통신공학과 и чунг хо 16
#define DEBUG #ifdef DEBUG // 여기에있는부분을실행한다. #endif //#define DEBUG 가정의되어있지않으면 //#ifdef DEBUG 에서 #endif 사이가컴파일되지않 // 는다. #ifndef //if not define 의의미 #ifdef 과반대의미예 ) #ifndef LIMIT #define LIMIT 256 #endif 한밭대정보통신공학과 и чунг хо 17
#define 의해지 #define LIMIT 256 #undef LIMIT 복잡한전처리기지시자는잘쓰이지않으므로필요시책을참고하기바람. 한밭대정보통신공학과 и чунг хо 18
Dynamic Allocation 구조체 Structure void * malloc(sizeof(char)*256) Struct TAGNAME { int a; double b; char c[12];} s; void * calloc(sizeof(char), 256) Allocation of Initial Value void * realloc(void *, size_t); Structure Array Reference of Structure Members Self-Referece NODE struct selfref { }; 공용체 Union int n; Union struct TAGNAME selfref *next; { int a; double b; char c[12];} Data usage, length of union Linked List 열거형 Enum struct linked_list { }; enum color {yellow, red, blue, magenta, green} col; *next; char *name; struct linked_list typedef struct linked_list NODE; typedef NODE * LINK ; 한밭대정보통신공학과 и чунг хо 19