簡體   English   中英

如何在 C 中初始化指向結構的指針數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM