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

为何为结构体指针分配内存时会出现结构体数据丢失问题?

问题原因及解决方案

核心错误:内存分配大小完全错误

你代码里的两处内存分配都存在致命问题,直接导致了内存越界和数据覆盖:

  1. Task结构体的内存分配错误
    你写的tasks[i] = malloc(sizeof(Task*));是给一个Task*类型指针分配空间,但实际上tasks[i]本身就是Task*,你需要给它分配整个Task结构体的内存,而不是指针的大小。比如32位系统下sizeof(Task*)是4字节,而你的Task结构体至少包含1个指针+3个整数,大小远大于4字节。这种情况下,当你给waitTime赋值时,会超出已分配的内存范围,覆盖掉taskName指针的内容,直接导致taskName指向非法地址,出现乱码或空值。

  2. taskName的内存分配错误
    tasks[i]->taskName = malloc(sizeof(char*));同样错误,sizeof(char*)是指针的大小(4或8字节),但你需要分配的是存储字符串内容的字节数,比如要存储长度为5的任务名,应该分配5 + 1字节(多1字节存字符串结束符'\0')。

正确的内存分配方式

// 1. 分配存储100个Task指针的数组(这部分你是对的)
Task** tasks = malloc(sizeof(Task*) * 100);

// 2. 为单个Task分配结构体大小的内存
tasks[i] = malloc(sizeof(Task));
if (tasks[i] == NULL) {
    // 处理内存分配失败的情况
}

// 3. 为taskName分配足够的内存,示例:存储"Task001"
const char* name = "Task001";
tasks[i]->taskName = malloc(strlen(name) + 1);
if (tasks[i]->taskName == NULL) {
    // 处理内存分配失败
}
strcpy(tasks[i]->taskName, name);

// 之后正常赋值其他字段
tasks[i]->arrivalTime = 0;
tasks[i]->burstTime = 5;
tasks[i]->waitTime = 0;

额外建议

  • 每次malloc后都要检查返回值是否为NULL,避免空指针访问。
  • 如果是复制字符串,也可以用strdup函数(注意部分环境需要手动引入头文件或定义宏),它会自动计算字符串长度并分配内存,简化代码:tasks[i]->taskName = strdup("Task001");。
  • 不再使用内存时,要逐层释放:先释放taskName,再释放tasks[i],最后释放tasks数组,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:05:32