동적 메모리 할당은 '런타임 시에 메모리를 할당하는 것을 말한다.'
런타임 시에 계산시 잠깐 쓰고 계산이 끝나면 지워버려도 되는 메모리를 사용할 때 주로 사용한다.
정적 메모리 할당은 '컴파일 시에 메모리를 할당하는 것을 말한다.'
메모리를 얼마나 사용할지 미리 알고 있다면 그 메모리를 정적 메모리로 할당하는 것이 유리하다.
-> 쓰레기값을 남긴 채 메모리를 할당한다.
-> 모든 값을 0으로 초기화한채 메모리를 할당한다.
동적할당한 메모리의 크기를 줄이거나 늘리는 용도로 사용한다.
#include <stdlib.h>
int main() {
int *ptr = (int*)malloc(sizeof(int)); // 동적 메모리 할당
*ptr = 10; // 할당된 메모리에 값 할당
// 메모리 해제를 하지 않음
// free(ptr); // 이 코드를 추가하여 메모리 누수를 방지할 수 있음
return 0; // 프로그램 종료 시 할당된 메모리가 해제되지 않아 메모리 누수 발생
}
free(동적할당한 포인터변수)
구조체(structure type)란 C언어의 기본 타입을 사용해 새로운 타입을 만든 것을 말한다.
LinkedList를 표현한 예제를 사용해보았다.
typedef struct _listnode
{
int item;
struct _listnode *next;
} ListNode;
typedef struct _linkedlist
{
int size;
ListNode *head;
} LinkedList;
구조체 변수에 접근하는 방법은 크게 2가지가 있지만
용도에 따라 다르게 사용해야한다.
구조체 멤버 변수에 직접 접근할 때 사용한다.
구조체 멤버 포인터 변수에 접근할 때 사용한다.
#include <stdio.h>
// 구조체 정의
struct Person {
int age;
};
int main() {
struct Person tom; // 구조체 변수 선언
struct Person *tom_ptr; // 구조체 포인터 선언
tom.age = 30; // '.' 연산자를 사용하여 구조체 멤버에 접근
tom_ptr = &tom;
printf("tom의 나이: %d\n", tom.age); // '.' 연산자 사용
printf("tom_ptr을 통한 나이: %d\n", tom_ptr->age); // '->' 연산자 사용
return 0;
}
#include <stdio.h>
int main(){
int arr[4];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
int arr[4][4];
printf("%d\n",*(arr + 3)); // arr[3]의 값을 출력
printf("%d\n",*(arr + 4)); // arr를 벗어난 주소의 값을 출력
return 0;
}