在 C 語言中初始化結構體陣列
Jinku Hu
2023年10月12日
本文將演示關於如何在 C 語言中初始化一個結構體陣列的多種方法。
在 C 語言中使用列表符號初始化結構體陣列
結構是派生資料型別,通常由多個成員組成。注意,struct
定義中的成員宣告順序很重要,當使用初始化器列表時,它也遵循同樣的順序。在下面的例子中,我們定義了一個名為 Person
的 struct
,它包括 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