在 C 语言中初始化结构体数组

Jinku Hu 2023年10月12日
  1. 在 C 语言中使用列表符号初始化结构体数组
  2. 使用一个单独的函数和循环来初始化 C 语言中的结构体数组
在 C 语言中初始化结构体数组

本文将演示关于如何在 C 语言中初始化一个结构体数组的多种方法。

在 C 语言中使用列表符号初始化结构体数组

结构是派生数据类型,通常由多个成员组成。注意,struct 定义中的成员声明顺序很重要,当使用初始化器列表时,它也遵循同样的顺序。在下面的例子中,我们定义了一个名为 Personstruct,它包括 2 个 char 数组,一个 int 和一个 bool。因此,我们声明一个 Person 结构的数组,并用大括号列表初始化它,就像初始化单一数据类型数组一样。然后我们使用 for 循环输出初始化的数组元素。不过要注意的是,由于我们在初始化列表的每个字符串字面中都包含了 0 字节,所以 char 数组会以%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

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C Struct