동적 메모리 할당 기술은 C언어에서 고급 프로그램 개발이 이루어질 때 빠질 수 없는 부분이다. 동적 메모리에 대한 활용이 익숙해지만 메모리에 대한 이해도가 높아지고 메모리를 적절하게 사용하는 방법을 알게 된다. 따라서 동적 메모리에 대한 개념을 바르게 이해하고 이를 활용할 수 있도록 반복적으로 이를 활용해 볼 필요가 있다.
#include <stdio.h>
#include <stdlib.h>
//구조체의 동적 메모리 할당
struct Book {
int number;
char title[100];
};
void showBook(struct Book* p, int n) {
int i;
for (i = 0; i < n; i++) {
printf("번호 = %d : %s\n", (p + i)->number, (p + i)->title);
}
}
int main(void){
struct Book* p; // struct Book에 해당하는 포인터를 만들어서 구조체를 할당받는다.
p = (struct Book*)malloc(2 * sizeof(struct Book));
if (p == NULL) {
printf("동적 메모리 할당에 실패했습니다.\n");
exit(1);
}
p->number = 1; //구조체 포인터같은 경우는 '.'을 이용하는것이 아니라 화살표를 이용해서 접근한다.
//p라는 구조체의 number에 값을 1로 넣어준거다.
strcpy(p->title, "C Programming");
(p + 1)->number = 2;
strcpy((p + 1)->title, "Data Structure");
showBook(p, 2);
free(p);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//동적 메모리 2차원 배열
int main(void){
int i, x, y;
int** pptr = (int**)malloc(sizeof(int*) * 8);
//int형 배열을 가지고 있는 포인터를 만든거나 마찬가지.
//각 한칸당 포인터를 할당하고 있는데 각 한칸의 포인터는 또다른 배열을 할당하고 있는 것이다.
for (i = 0; i < 8; i++) {
*(pptr + i) = (int*)malloc(sizeof(int) * 6);
}
for (y = 0; y < 8; y++) {
for (x = 0; x < 6; x++) {
*(*(pptr + y) + x) = 6 * y + x;
}
}
for (y = 0; y < 8; y++) {
for (x = 0; x < 6; x++) {
printf("%3d", *(*(pptr + y) + x));
}
printf("\n");
}
for (y = 0; y < 8; y++) {
free(*(pptr + y));
}
return 0;
}
포인터를 활용하면 전반적으로 어떻게 메모리를 사용하고 어떻게 활용이 되는지 알 수 가 있다.