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