C에서 malloc을 사용하여 구조체 메모리 할당
이 기사에서는 C에서 malloc
을 사용하여 구조체 메모리를 할당하는 방법에 대해 설명합니다.
sizeof
연산자와 함께malloc
을 사용하여 C에서 구조체 메모리 할당
malloc
은 할당 할 바이트 수를 나타내는 단일 정수 인수를 취하는 C의 동적 메모리 할당을위한 핵심 기능입니다. 정의 된 커스텀struct
객체의 메모리를 할당하려면sizeof
연산자를 호출하고 객체를 저장해야하는 메모리 양을 검색해야합니다.
sizeof(MyObject)
표현식을malloc
호출에 인수로 직접 전달할 수 있습니다. malloc
에 대한 한 가지주의 사항은 성공적으로 할당 된 메모리가 초기화되지 않아 일부 가비지 값이 저장 될 수 있다는 것입니다. 이 문제를 해결하기 위해 C 라이브러리는 또 다른 유용한 기능인calloc
을 제공하여 메모리 영역을 0으로 자동 초기화합니다. 다음 예제는 단일MyObject
구조에 대한 메모리 할당을 보여줍니다.
#include <stdio.h>
#include <stdlib.h>
enum VALID { FALSE, TRUE };
typedef struct {
int valid;
int *data;
size_t size;
} MyObject;
int main() {
int *tmp = NULL;
MyObject *my1 = malloc(sizeof(MyObject));
my1->valid = TRUE;
my1->data = tmp;
my1->size = sizeof tmp;
free(my1);
exit(EXIT_SUCCESS);
}
for
루프를 사용하여 C의 구조체 배열에 메모리 할당
스택에서 사용할 수있는 것보다 더 큰 메모리 영역이 필요할 수있는 구조 배열을 선언하는 것이 종종 유용합니다. 따라서 배열을 동적 메모리로 할당해야합니다. 다음 예제 코드는MyObject
구조체에 대한 100 개의 포인터 배열이 스택에 선언되었지만 각 개별MyObject
객체가 동적 메모리 (힙)에 할당 된 경우를 보여줍니다.
또한 테스트 목적으로 만MyObject
의 각 멤버를 초기화하는initMyObject
함수를 구현했습니다. 전달 된 포인터가 null
이면 함수는 -1
을 반환하고 if
문을 for
루프에 넣어 해당 오류 메시지가 인쇄되는지 확인합니다.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
enum VALID { FALSE, TRUE };
typedef struct {
int valid;
int *data;
size_t size;
} MyObject;
int initMyObject(MyObject *obj, int val, int *dat, size_t siz) {
if (!obj) return -1;
obj->valid = val;
obj->data = dat;
obj->size = siz;
return 0;
}
int main() {
int *tmp = NULL;
MyObject *arr[MAX];
for (int i = 0; i < MAX; ++i) {
arr[i] = malloc(sizeof(MyObject));
if (initMyObject(arr[i], TRUE, tmp, sizeof(tmp)) == -1) {
fprintf(stderr, "[ERROR] initMyObject() failed\n");
break;
}
}
printf("finished\n");
exit(EXIT_SUCCESS);
}
그러나 이전 프로그램의 일부는 프로덕션 코드에서 허용되지 않는 잘못된 부분이 있습니다. 루프에서 동적으로 할당 된 메모리 영역을 할당 해제하지 않고 프로그램이 종료됩니다. 할당과 유사하게 배열의 각 개별 요소를 해제해야합니다. 따라서 다음 코드 샘플에서 free
에 대한 반복 호출을 실행하기 위해 별도의 deallocMyObjectArray
함수를 구현했습니다.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
enum VALID { FALSE, TRUE };
typedef struct {
int valid;
int *data;
size_t size;
} MyObject;
int initMyObject(MyObject *obj, int val, int *dat, size_t siz) {
if (!obj) return -1;
obj->valid = val;
obj->data = dat;
obj->size = siz;
return 0;
}
int deallocMyObjectArray(MyObject *arr[], size_t len) {
if (!arr) return -1;
for (int i = 0; i < len; ++i) free(arr[i]);
return 0;
}
int main() {
int *tmp = NULL;
MyObject *arr[MAX];
for (int i = 0; i < MAX; ++i) {
arr[i] = malloc(sizeof(MyObject));
if (initMyObject(arr[i], TRUE, tmp, sizeof(tmp)) == -1) {
fprintf(stderr, "[ERROR] initMyObject() failed\n");
break;
}
}
deallocMyObjectArray(arr, MAX);
printf("finished\n");
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook