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

如何让结构体指针数组的每个元素指向独立内存以单独修改结构体?

问题描述

我有一个指向结构体的指针数组,希望数组每个元素指向不同的内存地址,这样就能通过指针单独修改每个结构体的值。现有示例代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:05:57