[英]How do I initialize an array of pointers to structures in C?
我正在嘗試創建一個指向結構的指針數組。 我希望每個結構在初始化時都具有相同的值,但指向它們的指針不同。
目前我正在嘗試這樣做:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
struct Node {
float value;
bool evaluated;
struct Node* children[10];
};
void main() {
int i;
struct Node* node = &(struct Node) {
.value = 0,
.evaluated = false,
.children = { 0 }
};
for (i = 0; i < 10; i++) {
node->children[i] = &(struct Node) {
.value = 0,
.evaluated = false,
.children = { 0 }
};
printf("Index: %d, pointer: %p\n", i, node->children[i]);
}
}
不幸的是,這給了我這些結果:
Index: 0, pointer: 00DEF640
Index: 1, pointer: 00DEF640
Index: 2, pointer: 00DEF640
Index: 3, pointer: 00DEF640
Index: 4, pointer: 00DEF640
Index: 5, pointer: 00DEF640
Index: 6, pointer: 00DEF640
Index: 7, pointer: 00DEF640
Index: 8, pointer: 00DEF640
Index: 9, pointer: 00DEF640
有什么方法可以產生相同的結果,但對每個結構都有不同的指針?
復合文字具有聲明它的塊的生命周期。因此,在for
循環的每次迭代之后,文字不再存在,因此指向它的指針無效,並且使用這樣的指針會觸發未定義的行為
您應該為每個實例動態分配內存,而不是使用復合文字。 由於您使用全零值初始化成員,因此您可以使用calloc
返回零初始化內存。
struct Node* node = calloc(1, sizeof(struct Node));
for (i = 0; i < 10; i++) {
node->children[i] = calloc(1, sizeof(struct Node));
printf("Index: %d, pointer: %p\n", i, node->children[i]);
}
為什么要使用指針?
struct Node {
float value;
bool evaluated;
struct {
float value;
bool evaluated;
} child[10];
} node;
初始化可能像memset( &node, 0, sizeof( node ) );
然后,您可以將node.value
用於頂層,並將node.child[i].value
用於 10 個“孩子”中的任何一個。
使用printf( "%d %p\n", i, &node.child[i] );
確認您有 10 個不同的“子節點”。
您是否希望 10 個“孩子”中的每一個都有 10 個(未使用的?)指針(指向孫子)?
當您使用復合文字時,對象的生命周期是包含塊。 當您在循環中執行此操作時,每個數組元素的生命周期將在循環迭代完成時結束。 所以這些指針變得無效。
您需要使用malloc()
的動態分配來創建多個數組元素。 然后,您可以通過從復合文字進行分配來復制到分配的內存中。
不需要為頂級節點使用復合文字,您可以在那里使用普通的局部變量。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
struct Node {
float value;
bool evaluated;
struct Node* children[10];
};
void main() {
int i;
struct Node node = {
.value = 0,
.evaluated = false,
.children = { 0 }
};
for (i = 0; i < 10; i++) {
node.children[i] = malloc(sizeof *node.children[i]);
*(node->children[i]) = (struct Node) {
.value = 0,
.evaluated = false,
.children = { 0 }
};
printf("Index: %d, pointer: %p\n", i, node->children[i]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.