C, C++

동적 할당, 구조체

swchung09 2025. 4. 15. 23:31

일반적인 배열과 변수는 메모리 안에 변수가 할당된다. 이는 코드가 컴파일 될 때 크기가 정해지기 때문에, 이후 크기를 런타임에 추가적으로 할당 하기 위해서는 동적 할당이 필요하다.


동적 할당에는 3가지 방법이있다.

-malloc() 가장 자주 사용되는 동적할당 방법이고, 원하는 자료형의 메모리를 직접할당하는 방식이다.

int *arr = (int *)malloc(n*sizeof(int));

(여기서 사용되는 sizeof는 자료형이나 배열의 크기를 리턴한다. 그러나 배열은 기본적으로 자료형의 크기*전체 수이다.)

-calloc() 메모리를 원하는 개수 만큼 정확히 할당하는 방법이다. 이 방법은 malloc(n*sizeof(int))일 경우 calloc(n, sizeof(int))와 같다.

int *arr2 = (int *)calloc(n, sizeof(int));

-realloc() 이미 선언된 변수나 배열을 초기화하고 다시 할당하는 방법이다.

int *arr3 = (int *)realloc(arr1, sizeof(int));

구조체는 다른 언어들의 클래스와 거의 같은 역할을 한다. 비록 C는 객체 지향적이지 않지만, 구조체로 객체 지향적인 것처럼(?) 만들 수도 있다.

우선 구조체는 다음과 같이 선언할 수 있다.

struct data{
	int int_data;
    char char_data;
}

여기서 data는 구조체 이름, int_data와 char_data는 data의 속성이다.

이후 다음과 같이 사용할 수 있다.

struct data my_data;

여기서 my_data는 객체의 이름과 같다.


구조체는 typedef를 사용하면 자료형으로 만들 수 있다.

typedef struct data_{
    int int_data;
    char char_data;
} data;

이 후 기존의 struct (구조체 이름) (객체 이름) 형식이 아닌, int같은 기본 자료형과 같은 방식으로 사용할 수 있다.

data my_data;

구조체로 포인터를 만들 수 있다.

struct data my_data;
struct data* my_data_p = &my_data;

이렇게 포인터로 하면, 나중에 접근할 때 *를 사용하지 않고, ->를 사용한다.

data_p -> int_data;

여기까지만 보면, 구조체는 단순히 변수만 속성으로 지정할 수 있고, 메서드는 사용할 수 없는 것 같지만, 함수 포인터를 사용하면 가능하다.

#include <stdio.h>
struct data {
    int int_data;
    char char_data;
    void (*print)(int, char);
}
void print_(int x, char y){
    printf("%d %c", x, y);
}
int main(){
    struct data my_data;
    my_data.print = print_;
    my_data.print(my_data.int_data, my_data.char_data);
    return 0;
}

 

'C, C++' 카테고리의 다른 글

재귀함수, 포인터  (0) 2025.04.14
배열, 변수(전역, 지역), 함수  (0) 2025.04.08
C 기본 문법  (0) 2025.04.06
포멧 문자  (0) 2025.04.02