015. DYNAMIC ALLOCATION

Posted on by pkchan

배열을 선언할 때 미리 원소의 개수를 지정해야 합니다. 이는 컴파일 시에 선언된 배열의 크기만큼 메모리 할당을 해야 하기 때문입니다. 동적 할당은 이런 불편함을 최소화하기 위해 실행 중에 동적으로 메모리를 할당하여 사용하는 방법을 말합니다. malloc, calloc, free, relloc 함수를 사용해야 하며, 이들 함수는 stdlib.h에 정의되어 있습니다. 최상단에 stdlib.h 파일을 포함 해야 합니다.

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

015-01 // MALLOC, CALLOC, FREE, REALLOC

ptr = malloc(byte-size);

malloc 함수는 인자로 받은 사이즈 만큼 메모리를 할당하고 메모리의 시작 주소를 void 포인터로 반환합니다. 포인터로 반환하기 때문에 포인터를 선언하고 대입해야 합니다. 이떄 리턴된 void 포인터는 선언한 포인터의 자료형으로 자동 변환됩니다. 만약 자동으로 변환되지 않고 컴파일 오류가 난다면, 대부분의 경우 C++컴파일러로 컴파일한 경우입니다. 이럴 때는 pointer = (cast_type*)malloc(byte-size); 와같이 해당 자료형으로 캐스팅해줘야 합니다.

ptr = calloc(n, element-size);

calloc 함수는 배열 원소의 개수와 배열 원소 자료형의 사이즈를 인자로 주면 0으로 초기화한 후 배열의 시작점을 void 포인터로 반환합니다. 나머지는 malloc함수와 같습니다. 초기화가 필요 없는 경우 malloc함수를 더 많이 사용합니다.

free(ptr);

malloc, calloc 함수가 메모리에 공간을 할당할 때 사용하는 메모리 영역은 heap영역입니다. heap영역은 동적 영역으로 사용자가 할당하고 관리하는 영역입니다. 이곳에 메모리가 쌓이게 되면 예기치 않은 오류가 발생할 수 있고, 메모리 누수가 생기기 쉽습니다. malloc, calloc 함수로 사용한 메모리 영역은 꼭 free 함수를 사용하여 반환해야 합니다.

ptr = realloc(ptr, newsize);

realloc 함수는 이미 할당된 영역의 사이즈를 조절할 때 사용합니다. 메모리의 다른 곳으로 옮겨갈 수 있으므로 해당 포인터에 다시 대입해줘야 합니다.

015-02 // ONE DIMENSIONAL ARRAY WITH MALLOC

/*
 example 015-01
 C language malloc
*/

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

void line(int counter);

int main(void) {
          
          int i,snum,sum=0;;
          int* pointer;
          
          printf("학생 수는 몇 명인가요? : ");
          scanf("%d",&snum);
          
          line(30);
          
          pointer = malloc(sizeof(int) * snum);
          
          for(i=0;i < snum;i++){
                    
                    printf("%d번 학생의 점수를 입력하세요 : ",i+1);
                    scanf("%d",&pointer[i]);
                    
                    sum += pointer[i];
                    
          }

          line(30);
          
          for(i=0;i < snum;i++){
                    
                    printf("%d번 학생의 점수는 %d점,\n",i+1,pointer[i]);
                    
          }

          line(30);

          printf("총점은 %d점, 평균은 %.2f점 입니다.\n",sum,(double)sum/snum);
          
          line(30);

          free(pointer);
          return 0;
          
}

void line(int counter){
          
          if(counter == 0){
                    
                    printf("\n");
                    return;
                    
          }
          
          printf("-");

          line(--counter);
          
}

015-03 // TWO DIMENSIONAL ARRAY WITH MALLOC

/*
 example 015-02
 C language malloc
*/

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

void line(int counter);

int main() {
          
          int i,j,s_num,c_num,sum;
          int** arr;
          
          printf("학생의 수를 입력하세요. : ");
          scanf("%d",&s_num);
          printf("과목의 수를 입력하세요. : ");
          scanf("%d",&c_num);
          
          arr = malloc(sizeof(int*) * s_num);
          
          for(i=0;i < s_num;i++){
                    
                    arr[i] = malloc(sizeof(int) * c_num);
                    
          }
          
          for(i=0;i < s_num;i++){
                    
                    line(20);
                    printf("%d번 학생입니다.\n",i+1);
                    sum = 0;
                    line(20);
                    
                    for(j=0;j < c_num;j++){
                              
                              printf("%d번 학생의 %d과목 점수를 입력하세요. : ",i+1,j+1);
                              scanf("%d",&arr[i][j]);
                              
                    }
                    
          }
          
          for(i=0;i < s_num;i++){
                    
                    sum = 0;
                    line(20);
                    printf("%d번 학생입니다.\n",i+1);
                    line(20);
                    
                    for(j=0;j < c_num;j++){
                              
                              sum += arr[i][j];

                              printf("%d번 학생의 %d과목 점수는 %d점입니다.\n",i+1,j+1,arr[i][j]);
                              
                    }
                    
                    printf("%d번 학생의 총점은 %d이고 평균은 %.2f입니다.\n",i+1,sum,(double)sum/c_num);
                    
          }

          for(i=0;i < s_num;i++){
                    
                    free(arr[i]);
                    
          }
          
          free(arr);
          return 0;
          
}

void line(int counter){
          
          if(counter == 0){
                    
                    printf("\n");
                    return;
                    
          }
          
          printf("-");

          line(--counter);
          
}

015-04 // STRUCTURE ARRAY WITH MALLOC

/*
 example 015-03
 C language malloc
*/

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

void cle(void);
int string_length(char* str);

typedef struct{
          
          int number;
          char name[30];
          double score;
          
}stu;

int main(){
          
          int n,i;
          
          printf("how many students in your class? : ");
          scanf("%d",&n);
          printf("\n");
          
          stu* p_stu = malloc(sizeof(stu) * n);
          
          for (i=0;i < n;i++){
                    
                    printf("student number : ");
                    scanf("%d",&p_stu[i].number);
                    cle();
                    
                    printf("student name : ");
                    fgets(p_stu[i].name,sizeof(p_stu[i].name),stdin);
                    p_stu[i].name[string_length(p_stu[i].name)-1] ='\0';
                    
                    printf("student score : ");
                    scanf("%lf",&p_stu[i].score);
                    
                    printf("\n");
                    
          }
          
          
          for (i=0;i < n;i++){
                    
                    printf("%d번 %s 학생의 점수는 %.2f입니다.\n",p_stu[i].number,p_stu[i].name,p_stu[i].score);
                    
          }
          
          free(p_stu);
          return 0;
          
}

void cle(void) {
          
          while (getchar() != '\n');
          
}

int string_length(char* str){
          
          int i=0;

          while(*str!='\0') {
                    
                    ++i;
                    ++str;
                    
          }
          
          return i;
          
}

Leave a Reply