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

Jinku Hu 2023년10월12일 C C Struct
  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);
}
튜토리얼이 마음에 드시나요? DelftStack을 구독하세요 YouTube에서 저희가 더 많은 고품질 비디오 가이드를 제작할 수 있도록 지원해주세요. 구독하다
작가: 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