Request[i] = (rand() % p->Need[i])+1 ;出现Integer division by zero
时间: 2024-02-18 13:02:54 浏览: 59
这个错误通常是因为 `p` 是一个空指针或者指向的结构体中的 `Need` 数组中某个元素为 `0`。在进行取模运算时,如果除数为 `0`,就会出现除以零的错误。为了避免这个错误,应该在进行取模运算之前,确保 `p` 不是空指针,并且 `p->Need[i]` 不为 `0`。可以使用条件语句(如 if 语句)来检查这些条件并处理相应的错误情况。例如:
```
if (p == NULL || p->Need[i] == 0) {
// 处理空指针或者 Need[i] 为 0 的情况
} else {
Request[i] = (rand() % p->Need[i]) + 1;
}
```
这样可以避免出现除以零的错误,同时保证程序的稳定性。
相关问题
帮我解释一下这段代码Status First_fit(int ID,int request)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode *p=block_first->next; while(p) { if(p->data.state==Free && p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; return OK; break; } if(p->data.state==Free && p->data.size>request) {//有空闲块能满足需求且有剩余" temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; break; } p=p->next; } return ERROR; }
这段代码实现了内存分配中的首次适应算法,用于为申请作业开辟内存空间。它的具体实现流程如下:
1. 传入作业名和申请量。
2. 为申请作业开辟新空间并初始化。
3. 遍历已有的内存块,找到第一个大小恰好合适的空闲块,将该块标记为“已使用”,并将其分配给当前作业。
4. 如果没有找到大小恰好合适的空闲块,则继续遍历,寻找大小大于申请量的空闲块。
5. 如果找到一个大小大于申请量的空闲块,则将新的空闲块插入到该块的前面,并将该块的地址、大小及状态更新,将空闲块的大小减去申请量,将该块的剩余部分作为新的空闲块。
6. 如果遍历完所有的内存块还是没有找到合适的空闲块,则返回错误。
7. 如果成功分配内存,则返回 OK。
这段代码使用了双向链表来维护内存块的信息,其中每个节点表示一个内存块,包含了地址、大小、状态和作业ID等信息。
Status Bad_fit(int request) { int ch; DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.size=request;//把新进程的空间及状态赋给新增的指针 temp->data.state=Busy; DuLNode *p = block_last;//p是为了查找符合新进程所需空闲区大小的遍历指针 DuLNode *p1 = block_first->next;//p1是为了将新增的指针插入到进程分配表中 while(p) { if(request<(p->data.size))//在空闲区查找是否存在大于申请进程大小的空闲区 { temp->prior=p1->prior;//找到则将新分配的进程信息插入到进程分配表的首地址 temp->next=p1; temp->data.address=p->data.address; p1->prior->next=temp; p1->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; break; } else if(request==(p->data.size))//查找是否有空闲区存在等于申请分配内存的进程大小 { p->prior->next=p->next;//找到则将心分配的进程信息插入到进程分配表中 temp->prior=p1->prior; temp->next=p1; temp->data.address=p->data.address; p1->prior->next=temp; p1->prior=temp; return OK; break; } else//前面俩种情况都没找到则直接输出内存不够 { return ERROR; } } return ERROR; }
这段代码是一个简单的动态分区分配算法(基于双向链表实现),用于管理操作系统内存中的空闲区和占用区。函数名 Bad_fit 说明它是一个比较简单的分配算法,在空闲区中找到第一个大于或等于请求大小的区域,并将其分配给进程。如果没有找到合适的空闲区,就返回错误。
具体来说,这段代码的功能是在空闲区中查找大小大于或等于请求的区域,并将其分配给进程。如果找到了合适的空闲区,则将进程的信息插入到进程分配表中,并更新空闲区的状态。如果没有找到合适的空闲区,则返回错误。
具体实现方式是:首先创建一个指向空闲区链表的指针 temp,并将新进程的空间及状态赋给它,然后创建两个遍历指针 p 和 p1,分别用于查找符合新进程所需空闲区大小的空闲区和将新增的指针插入到进程分配表中。然后在空闲区链表中查找大小大于或等于请求的空闲区,如果找到了符合要求的空闲区,则将新进程的信息插入到进程分配表中,并更新空闲区的状态。如果没有找到符合要求的空闲区,则返回错误。
阅读全文