在 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