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

使用realloc()操作结构体数组时数据丢失的原因咨询

问题分析:realloc后结构体数组数据丢失的原因

你的核心错误是调用realloc时传入的内存大小参数错误:

realloc的第二个参数需要的是总字节数,而不是元素个数。你代码中写的realloc(a, n)只分配了11字节的内存,但11个sNum结构体需要的内存是11 * sizeof(struct sNum)(每个sNum至少占4字节,总字节数至少44)。内存分配不足直接导致原有数据被覆盖破坏,出现乱码值。

修正步骤

将realloc的调用改为:

a = (struct sNum*)realloc(a, n * sizeof(struct sNum));

同时别忘了在程序结束前调用free(a)释放内存,避免内存泄漏。

修正后的完整代码:

#include <iostream>
#include <string>

struct sNum
{
    int b = 0;
};

int main()
{
    int n = 10;
    struct sNum* a;
    a = (struct sNum*)malloc(n * sizeof(struct sNum));
    for (int i = 0; i < n; i++)
    {
        a[i].b = i;
        std::cout << std::to_string(a[i].b) + " ";
    }
    std::cout << "\n";
    n++;
    // 传入正确的总字节数
    a = (struct sNum*)realloc(a, n * sizeof(struct sNum));
    a[n - 1].b = n - 1;
    for (int i = 0; i < n; i++)
    {
        std::cout << std::to_string(a[i].b) + " ";
    }
    // 释放内存
    free(a);
    return 0;
}

运行修正后的代码,就能得到预期输出:

0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 10

额外提示(C++场景)

在C中,不推荐使用malloc/free/realloc这类C语言内存函数,因为它们不会调用C对象的构造和析构函数。你的结构体sNum有默认成员初始化int b=0;,malloc分配的内存并不会执行这个初始化逻辑(虽然你后续手动赋值覆盖了,但如果是更复杂的类会出问题)。

推荐使用C++标准库容器(比如std::vector)来管理动态数组,无需手动处理内存分配和释放,更安全简洁:

#include <iostream>
#include <vector>

struct sNum
{
    int b = 0;
};

int main()
{
    std::vector<sNum> a(10);
    for (int i = 0; i < a.size(); i++)
    {
        a[i].b = i;
        std::cout << std::to_string(a[i].b) + " ";
    }
    std::cout << "\n";
    a.emplace_back(); // 向数组末尾添加一个新元素
    a.back().b = a.size() - 1;
    for (const auto& num : a)
    {
        std::cout << std::to_string(num.b) + " ";
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Victor Rocon Covre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:05:47