在 C 語言中初始化結構體陣列

Jinku Hu 2023年1月30日 2021年2月28日
  1. 在 C 語言中使用列表符號初始化結構體陣列
  2. 使用一個單獨的函式和迴圈來初始化 C 語言中的結構體陣列
在 C 語言中初始化結構體陣列

本文將演示關於如何在 C 語言中初始化一個結構體陣列的多種方法。

在 C 語言中使用列表符號初始化結構體陣列

結構是派生資料型別,通常由多個成員組成。注意,struct 定義中的成員宣告順序很重要,當使用初始化器列表時,它也遵循同樣的順序。在下面的例子中,我們定義了一個名為 Personstruct,它包括 2 個 char 陣列,一個 int 和一個 bool。因此,我們宣告一個 Person 結構的陣列,並用大括號列表初始化它,就像初始化單一資料型別陣列一樣。然後我們使用 for 迴圈輸出初始化的陣列元素。不過要注意的是,由於我們在初始化列表的每個字串字面中都包含了 0 位元組,所以 char 陣列會以%s 格式指定符列印出來。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.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 <stdio.h>
#include <stdlib.h>
#include <stdbool.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

...
Author: 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

相關文章 - C Struct