为何为结构体指针分配内存时会出现结构体数据丢失问题?
问题原因及解决方案
核心错误:内存分配大小完全错误
你代码里的两处内存分配都存在致命问题,直接导致了内存越界和数据覆盖:
Task结构体的内存分配错误
你写的tasks[i] = malloc(sizeof(Task*));是给一个Task*类型指针分配空间,但实际上tasks[i]本身就是Task*,你需要给它分配整个Task结构体的内存,而不是指针的大小。比如32位系统下sizeof(Task*)是4字节,而你的Task结构体至少包含1个指针+3个整数,大小远大于4字节。这种情况下,当你给waitTime赋值时,会超出已分配的内存范围,覆盖掉taskName指针的内容,直接导致taskName指向非法地址,出现乱码或空值。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
相关产品推荐
相关产品推荐

