如何让结构体指针数组的每个元素指向独立内存以单独修改结构体?
问题描述
我有一个指向结构体的指针数组,希望数组每个元素指向不同的内存地址,这样就能通过指针单独修改每个结构体的值。现有示例代码如下:
struct Person { int age; char *name[64]; }; int main() { struct Person *people[4]; struct Person tmp_person; people[0] = &tmp_person; people[0]->age = 12; people[0]->name = "John"; people[1] = &tmp_person; people[1]->age = 34; people[1]->name = "Mike"; }
当前代码中所有数组元素都指向同一个tmp_person内存空间,导致最终所有person内容一致。我不想逐个创建临时变量,请问如何生成唯一的指针?
解决方案
使用动态内存分配是最直接的方案,通过malloc为每个数组元素分配独立的堆内存,就能让每个指针指向唯一的地址。需要注意用完内存后用free释放,避免泄漏。
修改后的代码示例:
#include <stdlib.h> #include <string.h> struct Person { int age; char name[64]; // 调整为字符数组,更适合存储名字 }; int main() { struct Person *people[4]; int i; // 为每个元素分配独立内存 for (i = 0; i < 4; i++) { people[i] = malloc(sizeof(struct Person)); if (people[i] == NULL) { // 内存分配失败,直接退出 return 1; } } // 给结构体赋值 people[0]->age = 12; strcpy(people[0]->name, "John"); people[1]->age = 34; strcpy(people[1]->name, "Mike"); // 释放内存 for (i = 0; i < 4; i++) { free(people[i]); people[i] = NULL; // 清空指针,避免野指针 } return 0; }
关键说明
- 原代码中
char *name[64]是64个字符指针的数组,若仅用于存储名字,改为char name[64]更合理,可直接用strcpy复制字符串,避免指针指向只读字符串字面量的问题。 malloc从堆中分配内存,每次调用都会返回一块新的独立内存块,确保数组中每个指针指向唯一地址。- 必须检查
malloc的返回值:如果返回NULL,说明内存分配失败,需要做错误处理。 - 不再使用内存时,务必调用
free释放,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者SuperCarrot
相关产品推荐
相关产品推荐

