C에서 malloc을 사용하여 구조체 메모리 할당

Jinku Hu 2023년10월12일
  1. sizeof 연산자와 함께malloc을 사용하여 C에서 구조체 메모리 할당
  2. for 루프를 사용하여 C의 구조체 배열에 메모리 할당
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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Struct