C语言实现可变分区内存管理:输入进程信息,输出空闲分区个数
```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int start; int size; } Partition; // 比较函数,用于qsort排序 int compare(const void *a, const void *b) { return ((Partition *)a)->start - ((Partition *)b)->start; } int main() { int n; scanf("%d", &n); // 读取已占用分区信息 Partition *occupied = (Partition *)malloc(n * sizeof(Partition)); for (int i = 0; i < n; i++) { scanf("%d %d", &occupied[i].start, &occupied[i].size); } // 读取回收进程信息 char回收进程[100]; scanf("%s", 回收进程); // 将回收进程编号转换为数组 char *token = strtok(回收进程, " "); int回收进程编号[10]; int回收进程数量 = 0; while (token != NULL) { 回收进程编号[回收进程数量++] = atoi(token); token = strtok(NULL, " "); } // 检查回收进程是否存在 for (int i = 0; i < 回收进程数量; i++) { if (回收进程编号[i] > n || 回收进程编号[i] <= 0) { printf("false\n"); free(occupied); return 0; } } // 排序已占用分区 qsort(occupied, n, sizeof(Partition), compare); // 回收分区 for (int i = 0; i < 回收进程数量; i++) { for (int j = 0; j < n; j++) { if (j + 1 == 回收进程编号[i]) { occupied[j].start = -1; // 标记为已回收 break; } } } // 合并空闲分区 Partition *freePartitions = (Partition *)malloc((n + 1) * sizeof(Partition)); int freeCount = 0; int lastEnd = 0; for (int i = 0; i < n; i++) { if (occupied[i].start != -1) { if (occupied[i].start > lastEnd) { freePartitions[freeCount].start = lastEnd; freePartitions[freeCount].size = occupied[i].start - lastEnd; freeCount++; } lastEnd = occupied[i].start + occupied[i].size; } } // 检查最后一个分区之后是否有空闲空间 if (lastEnd < 512) { freePartitions[freeCount].start = lastEnd; freePartitions[freeCount].size = 512 - lastEnd; freeCount++; } // 输出空闲分区个数 printf("%d\n", freeCount); // 释放内存 free(occupied); free(freePartitions); return 0; } ``` ### 额外需要注意的逻辑点: 1. **边界检查**:确保输入的进程编号在合理范围内,避免越界访问。 2. **排序**:在处理分区合并之前,确保已占用分区按起始地址排序,以便正确合并相邻的空闲分区。 3. **内存管理**:动态分配的内存需要在程序结束前释放,防止内存泄漏。 ######[AI写代码神器 | 772点数解答 | 2024-11-21 16:38:15]
- Java:抽象类 Vehicle 及子类 Car、MotorBike 实战演示(讯飞星火 | 440点数解答 | 2024-06-06 23:18:54)334
- 用 Pandas 深度剖析数据:从读取到统计分析全流程实战(GPT | 642点数解答 | 2024-06-30 15:39:49)382
- 用 Pandas 深入分析招聘数据:从数据读取到可视化全流程解析(GPT | 1539点数解答 | 2024-06-30 15:56:50)394
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)383
- 工程师必备!10 种工程日常易用管理工具大揭秘(百度文心 | 346点数解答 | 2023-11-09 18:26:09)311
- C++实现戴夫后院抵御僵尸的植物选择策略(DeepSeek | 773点数解答 | 2026-01-19 19:20:57)67
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)352
- 星际编码大赛终极对决:机械星AI与异星人激战“逆序对”统计难题(字节豆包 | 509点数解答 | 2025-04-19 17:33:00)299
- C++ 实现游戏赢家判断:巧妙找出满足和条件的最大数 (DeepSeek | 506点数解答 | 2025-06-20 16:18:09)130
- C++ 实现根据部分橘子重量估算整箱橘子重量(字节豆包 | 371点数解答 | 2026-04-11 13:12:51)19
- 高效计算逆序对:归并排序分治法详解与Python实现(阿里通义 | 1144点数解答 | 2026-03-18 17:49:11)53
- 解决 P2216 第 x 个数问题的 C++ 代码实现(字节豆包 | 368点数解答 | 2026-03-27 21:15:43)46