C에서 구조체 배열 초기화

Jinku Hu 2023년10월12일
  1. 목록 표기법을 사용하여 C에서 구조체 배열 초기화
  2. 별도의 함수와 루프를 사용하여 C에서 구조체 배열 초기화
C에서 구조체 배열 초기화

이 기사에서는 C에서struct배열을 초기화하는 방법에 대한 여러 방법을 보여줍니다.

목록 표기법을 사용하여 C에서 구조체 배열 초기화

구조는 일반적으로 여러 멤버로 구성된 파생 데이터 유형입니다. struct정의에서 멤버 선언 순서가 중요하며 이니셜 라이저 목록이 사용될 때 동일한 순서를 따릅니다. 다음 예에서는Person이라는struct를 정의합니다. 여기에는 2 개의char배열,intbool이 포함됩니다. 결과적으로Person구조의 배열을 선언하고 단일 데이터 유형 배열과 마찬가지로 중괄호 목록으로 초기화합니다. 그런 다음for루프를 사용하여 초기화 된 배열 요소를 출력합니다. 그래도char배열은 이니셜 라이저 목록의 각 문자열 리터럴에\0바이트를 포함했기 때문에%s형식 지정자로 인쇄됩니다.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Person {
  char firstname[40];
  char lastname[40];
  int age;
  bool alive;
} Person;

int printPerson(Person *p) {
  if (p == NULL) return -1;

  printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
         p->age);
  p->alive ? printf("Yes\n") : printf("No\n");

  return 0;
}

int main(void) {
  Person arr[] = {
      {"John\0", "McCarthy\0", 24, 1},
      {"John\0", "Kain\0", 27, 1},
  };

  size_t size = sizeof arr / sizeof arr[0];
  for (int i = 0; i < size; ++i) {
    printPerson(&arr[i]);
    printf("\n");
  }

  exit(EXIT_SUCCESS);
}

출력:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

별도의 함수와 루프를 사용하여 C에서 구조체 배열 초기화

이전 방법의 단점은 하드 코딩 된 값으로 배열을 초기화 할 수 있거나 배열이 클수록 초기화 문이 커진다는 것입니다. 따라서 단일struct요소 초기화 함수를 구현하고struct배열을 수행하기 위해 반복에서 호출해야합니다. initPerson함수는 모든struct멤버 값을 인수로 취하고 매개 변수로도 전달 된Person오브젝트에 할당합니다. 마지막으로printPerson함수를 사용하여 배열의 각 요소를 콘솔에 출력합니다. 데모 목적으로 만 동일한Person값을 초기화 함수에 전달합니다.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Person {
  char firstname[40];
  char lastname[40];
  int age;
  bool alive;
} Person;

int printPerson(Person *p) {
  if (p == NULL) return -1;

  printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
         p->age);
  p->alive ? printf("Yes\n") : printf("No\n");

  return 0;
}

int initPerson(Person *p, char *fn, char *ln, int age, bool alive) {
  if (p == NULL) return -1;

  memmove(&p->firstname, fn, strlen(fn) + 1);
  memmove(&p->lastname, ln, strlen(ln) + 1);
  p->age = age;
  p->alive = alive;

  return 0;
}

enum { LENGTH = 10 };

int main(void) {
  Person me = {"John\0", "McCarthy\0", 24, 1};
  Person arr[LENGTH];

  for (int i = 0; i < LENGTH; ++i) {
    initPerson(&arr[i], me.firstname, me.lastname, me.age, me.alive);
  }

  for (int i = 0; i < LENGTH; ++i) {
    printPerson(&arr[i]);
    printf("\n");
  }

  exit(EXIT_SUCCESS);
}

출력:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

...
작가: 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