我试图编写用于在计算机中模拟MMU的代码(有点无关紧要),在调试器中经过断点后,我发现我遇到了麻烦用于搜索和插入的链表。
如果我没有包含该行" table-> first = NULL;"然后我得到一个访问冲突错误,因为它跳过了#34; if(table-> first == NULL){"在我的插入功能中。
此外,当我尝试使用我的搜索功能时(在将一个节点插入列表之后),while循环将进行第二次迭代(即使不应该是表 - >当前点的任何内容to)然后在该行上引起另一次访问冲突" sum = table-> current-> end - table-> current-> start;"
是否存在链接列表和我丢失的NULL值?我还尝试将while循环条件(在我的搜索功能中)更改为" while(table-> current)"和"而(table-> current!= 0)"这两种变化都没有区别。你可以忽略所有的pthread部分,我把它们注释掉了,因为我在windows机器/避风港上进行调试还没到那个部分。
感谢您提供任何建议!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <pthread.h>
#define max_size 20
struct node //nodes for double linked list
{
int start;
int end;
int free; //Tags for removal
struct node *prev;
struct node *next;
};
typedef struct node node;
typedef struct //double linked list struct for page table
{
node *first;
node *last;
node *current;
int is_available; //Determines whether or not enough space is available
} page_table;
//pthread_mutex_t mux;
page_table* table;
void Insert(node *old, node *newnode, int size);
void Remove(node *node);
node* Search(int size);
void tagRemove(int size);
int main()
{
table = (page_table*) malloc(sizeof(page_table));
table->first = NULL;
table->last = NULL;
node* node1 = (node*) malloc(sizeof(node));
node* node2 = (node*) malloc(sizeof(node));
node* node3 = (node*) malloc(sizeof(node));
node* node4 = (node*) malloc(sizeof(node));
Insert(NULL, node1, 2);
node* temp = Search(3);
//Insert(temp, node2, 3);
//temp = Search(4);
//Insert(temp, node3, 4);
}
void Insert(node *old, node *newnode, int size)
{
if(table->first == NULL){
table->first = newnode;
table->last = newnode;
newnode->start = 0;
}
else if(old->next == NULL){
old->next = newnode;
newnode->prev = old;
table->last = newnode;
newnode->start = old->end;
}
else if(old == table->first){
newnode->next = table->first;
table->first->prev = newnode;
table->first = newnode;
newnode->start = 0;
}
else{
newnode->next = old->next;
old->next = newnode;
newnode->prev = old;
newnode->start = old->end;
}
newnode->end = newnode->start + size;
newnode->free = 0;
table->current = newnode;
}
void Remove(node *node)
{
if(node == table->first && node == table->last) {
table->first = NULL;
table->last = NULL;
} else if(node == table->first) {
table->first = node->next;
table->first->prev = NULL;
} else if (node == table->last) {
table->last = node->prev;
table->last->next = NULL;
} else {
node->next->prev = node->prev;
node->prev->next = node->next;
}
}
node* Search(int size){
table->current = table->first;
int temp_size;
int sum = 0;
while(table->current != NULL){
temp_size = 0;
sum = table->current->end - table->current->start;
if(sum>=max_size)
return NULL;
temp_size = table->current->end - table->current->start;
table->current = table->current->next;
if(size<=temp_size)
return table->current->prev;
}
return 0;
}
void tagRemove(int size)
{
int sum;
node* temp = table->first;
sum = temp->end - temp->start;
temp->free = 1;
while(temp != NULL){
temp = temp->next;
sum += temp->end - temp->start;
temp->free = 1;
if(sum < size)
return;
}
}
答案 0 :(得分:0)
如果您始终使用calloc
代替malloc
,则可以省去很多麻烦。 calloc
清除它分配给全零的内存,而malloc
则没有。通过快速浏览代码,您可能希望将所有已分配的内存归零。
案例,node1->next
和node1->prev
未初始化,但在您将node1
插入表格后,您会在搜索过程中使用它们。
答案 1 :(得分:0)
你试过吗
node1->next=NULL Insert(NULL, node1, 2); node* temp = Search(3);
?这会产生同样的错误吗?