You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中初始化指向独立结构体实例的指针数组?

如何让指针数组指向独立的结构体实例且初始值一致?

问题原因

你当前代码中使用的&(struct Node) { ... }是C99引入的复合字面量,在循环内部定义时,它属于自动存储期(栈内存)。每次循环迭代时,这块栈空间会被重复利用,因此每次取到的地址完全相同,最终所有children指针都指向同一个结构体实例,这就是输出地址全部一致的原因。

解决方案

要创建独立的结构体实例,需要为每个结构体分配动态堆内存,通过malloc申请空间后再初始化成员。可以封装一个辅助函数来统一处理内存分配和初始化,避免重复代码。

修改后的代码

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

struct Node {
    float value;
    bool evaluated;
    struct Node* children[10];
};

// 创建并初始化一个独立的Node实例
struct Node* create_node(void) {
    struct Node* new_node = malloc(sizeof(struct Node));
    if (new_node == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 统一初始化成员
    new_node->value = 0.0f;
    new_node->evaluated = false;
    // 将children数组全部初始化为NULL
    for (int i = 0; i < 10; i++) {
        new_node->children[i] = NULL;
    }
    return new_node;
}

int main() { // 标准C要求main返回int类型
    int i;

    struct Node* node = create_node();

    for (i = 0; i < 10; i++) {
        node->children[i] = create_node();
        printf("Index: %d, pointer: %p\n", i, node->children[i]);
    }

    // 释放动态分配的内存,避免泄漏
    for (i = 0; i < 10; i++) {
        free(node->children[i]);
    }
    free(node);

    return 0;
}

关键说明

  • malloc会为每个结构体分配独立的堆内存,每个实例拥有唯一的内存地址,不会被复用。
  • 辅助函数create_node封装了内存分配和初始化逻辑,后续如果需要修改初始值,只需修改这一处即可。
  • 标准C中main函数的返回类型必须是int,使用void main是非标准写法,建议修正。
  • 动态分配的内存必须手动释放,示例中简单实现了内存释放,若你的结构是树形结构,需要递归释放所有子节点。

内容的提问来源于stack exchange,提问作者Arkleseisure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:24:24