| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 718 人关注过本帖
标题:双链表编写malloc项目时出现段错误,但不知错在哪里,求助
只看楼主 加入收藏
战斗!立
Rank: 2
等 级:论坛游民
帖 子:29
专家分:43
注 册:2011-11-26
结帖率:100%
收藏
 问题点数:0 回复次数:1 
双链表编写malloc项目时出现段错误,但不知错在哪里,求助
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MEM_SIZE 10000
#define LB_SIZE 12
#define ARR_LENGTH 100//
char start[MEM_SIZE];// 分配总内存大小 10000 字节
typedef struct l_block{  // 目录项结构
    struct l_block *next;
    int size;
}LBlock;
LBlock *head;
LBlock *freehead=NULL;  // 全局指针,指针表头
LBlock *busyhead=NULL;
void init_lblock(LBlock **L);  // 初始化, 设置一下表头。
void *lmalloc(size_t size);    // 分配内存
void *blmalloc(size_t size);   // 同上 用最佳拟合法
void lfree(void *ptr);  //释放内存

int main(int argc, char* argv[])
{
    init_lblock(&head);//初始化
    freehead=head;
    char* testarray[ARR_LENGTH]={};
    int i=0,index=0;
    for(i=0;i<100000;i++)
    {
        //printf("i=%d\n",i);
        index=random()%ARR_LENGTH;
        if(testarray[index]==NULL)
        {
            testarray[index]=(char*)lmalloc(20+random()%100);//改为自己实现的MALLOC函数
            strcpy(testarray[index],"this is a test");
            puts(testarray[index]);
        }
        else
        {
            lfree(testarray[index]);//改为自己实现的FREE函数
            testarray[index]=NULL;
        }
    }
    return (EXIT_SUCCESS);
}

void init_lblock(LBlock **L)  // 初始化, 设置一下表头。
{
    (*L)=(LBlock*)&start[0];
    (*L)->size=MEM_SIZE-8;
    (*L)->next=NULL;
}
void *lmalloc(size_t size)   // 分配内存
{
    LBlock* p;
    p=freehead;
    LBlock* mark;
    mark=NULL;
    int dis;
    LBlock* front=NULL;
    if(freehead==NULL)
    {
        printf("no free\n");
        return;
    }
      if(p->size>=size)
    {
        mark=p;
    }
    else
    {
        while(p)
        {
            if(p->next && p->next->size>=size)
            {
                mark=p->next;
                front=p;
                break;
            }
            p=p->next;
        }
    }
    if(mark==NULL)
    {
        printf("the area is not empty!\n");
        return;
    }
    if(mark->size>=size+12)
    {
        dis=mark->size-size;
        LBlock* newnode=(LBlock*)( (char*)mark+8+size );
        newnode->size=dis-8;
        newnode->next=mark->next;
        mark->next=newnode;
        mark->size=size;
    }
    if(front)        front->next=mark->next;
    else        freehead=mark->next;
    mark->next=busyhead;
    busyhead=mark;
    return (char*)busyhead+8;
}
void *blmalloc(size_t size)  // 同上 用最佳拟合法
{
    
}
void lfree(void *ptr)  //释放内存
{
    if(busyhead==NULL)    return;
    LBlock* p;
    p=busyhead;
    LBlock* mark;
    mark=NULL;
    LBlock* front;
    front=NULL;
    if( ((char*)busyhead+8)==ptr )
    {
        mark=busyhead;
    }
    else
    {
        while(p)
        {
            if( p->next && ((char*)p->next+8)==ptr )
            {
                mark=p->next;
                front=p;
                break;
            }
            p=p->next;
        }
    }
    if(mark==NULL)
    {
        printf("not found!\n");
        return;
    }
    if(front)    front->next=mark->next;
    else     busyhead=mark->next;
    mark->next=freehead;
    freehead=mark;
    printf("busyhead=%p\tfreehead=%p\n",busyhead,freehead);
}



求大侠们各显神通
搜索更多相关主题的帖子: 项目 color 
2011-12-29 17:56
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
      if(freehead==NULL)
    {
        printf("no free\n");
        return;
    }


    if(mark==NULL)
    {
        printf("the area is not empty!\n");
        return;
    }

这两个地方要个返回值吧。

return NULL; // 或者 0;就ok了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-03-01 16:02
快速回复:双链表编写malloc项目时出现段错误,但不知错在哪里,求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012628 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved