使用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
相关产品推荐
相关产品推荐

