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

如何将含malloc动态数组的结构体写入文件并读取s_bits内容

带动态指针的结构体文件读写解决方案

你的问题核心在于:结构体中的s_bits是指针类型,直接用fwrite写入结构体时,只会把指针的内存地址值写入文件,而非指针指向的动态数组实际数据。读取时这个地址已无效,自然拿不到真实内容。

正确写入步骤

需要分两步写入:先写结构体本身,再写动态数组的内容,确保数据完整存储。

示例代码:

// 假设res已分配空间,res->s_bits已malloc并填充数据
FILE *fp = fopen("codi.dat", "wb");
if (!fp) {
    perror("打开文件失败");
    return -1;
}

// 1. 写入结构体(包含指针地址,后续读取时会重新分配内存)
if (fwrite(res, sizeof(struct save), 1, fp) != 1) {
    perror("写入结构体失败");
    fclose(fp);
    return -1;
}

// 2. 写入s_bits指向的动态数组内容
if (fwrite(res->s_bits, sizeof(char), res->s_sim, fp) != res->s_sim) {
    perror("写入动态数组失败");
    fclose(fp);
    return -1;
}

fclose(fp);

正确读取步骤

读取需对应写入顺序:先读结构体,再根据结构体中的s_sim值分配内存,最后读取动态数组内容。

示例代码:

struct save *res_read = malloc(sizeof(struct save));
if (!res_read) {
    perror("分配结构体内存失败");
    return -1;
}

FILE *fp = fopen("codi.dat", "rb");
if (!fp) {
    perror("打开文件失败");
    free(res_read);
    return -1;
}

// 1. 读取结构体
if (fread(res_read, sizeof(struct save), 1, fp) != 1) {
    perror("读取结构体失败");
    fclose(fp);
    free(res_read);
    return -1;
}

// 2. 为s_bits分配对应大小的内存
res_read->s_bits = malloc(sizeof(char) * res_read->s_sim);
if (!res_read->s_bits) {
    perror("分配动态数组内存失败");
    fclose(fp);
    free(res_read);
    return -1;
}

// 3. 读取动态数组内容
if (fread(res_read->s_bits, sizeof(char), res_read->s_sim, fp) != res_read->s_sim) {
    perror("读取动态数组失败");
    fclose(fp);
    free(res_read->s_bits);
    free(res_read);
    return -1;
}

fclose(fp);

// 使用完毕后释放内存
free(res_read->s_bits);
free(res_read);

注意事项

  • 必须以二进制模式打开文件(wb/rb),避免文本模式的换行符转换破坏二进制数据
  • 读写顺序必须严格匹配:先结构体后动态数组,不可颠倒
  • 务必检查每个IO操作的返回值,及时处理错误
  • 读取完成后要释放所有分配的内存,避免内存泄漏

内容的提问来源于stack exchange,提问作者Gabriel Lizardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:40:34