如何在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
相关产品推荐
相关产品推荐

