小弟用C写了一个数组的数据结构,在本机上编译出来运行,总是随机性出错,初步判断是和内存分配有关,求帮忙看下(问题已解决,已更新)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define B_MAX 5

typedef struct bucket bucket;
typedef struct list list;

struct bucket
{
    int key;
    list * value;
    bucket * previous;
    bucket * next;
    list * tail;
};
struct list
{
    char * key;
    char * value;
    int position;
    list * previous;
    list * next;
};

int size_l=sizeof(list);
int size_b=sizeof(bucket);


void * my_malloc(int size)
{
    void * point;
    if((point=malloc(size))==NULL)
    {
        fprintf(stdout,"内存分配失败:%s\t",strerror(errno));
        return NULL;
    }
    else
    {
        return point;
    }
}

int add(bucket * b,char * key,char * value)
{
    if(strlen(key)>0)
    {
        char index=key[0];

        int index_h=((int)(index))%B_MAX;
        //printf("[%d]\t",index_h);

        bucket * loc=b+index_h;

        if(loc->value==NULL)
        {
            list * node_t=(list *)my_malloc(size_l);
            node_t->previous=NULL;
            node_t->next=NULL;
            node_t->value=value;
            node_t->key=key;
            node_t->position=1;
            loc->value=node_t;
            loc->tail=node_t;

        }
        else
        {
            //find
            list * l=loc->value;
            int find_flag=0;
            while(l!=NULL)
            {
                if(!strcmp(l->key,key))
                {
                    find_flag=1;
                    break;
                }
                l=l->next;
            }
            if(!find_flag)
            {
                list * node_t=(list *)my_malloc(size_l);
                node_t->key=key;
                node_t->value=value;
                node_t->next=NULL;
                node_t->previous=loc->tail;
                node_t->position++;
                loc->tail->next=node_t;
                loc->tail=node_t;
            }
            else
            {
                return 0;
            }

        }
        return 1;
    }
    return -1;
}
int find(bucket * b,char * key)
{

}


void main()
{

    bucket * first=(bucket *)my_malloc(B_MAX*size_b);

    for(int i=0;i<B_MAX;i++)
    {
        bucket * loc=(first+i);
        if(i==B_MAX-1)
        {
            loc->next=NULL;
        }
        else
        {
            loc->next=loc+1;
        }

        if(i==0)
        {
            loc->previous=NULL;
        }
        else
        {
            loc->previous=loc-1;
        }

        loc->key=i;
        loc->value=NULL;
    }



    /*

    bucket * tmp=first;
    while(tmp!=NULL)
    {
        fprintf(stdout,"%d\t",tmp->key);
        tmp=tmp->next;
    }
     fprintf(stdout,"\n");
     */

     add(first,"a","123");
     add(first,"b","f2321d");
     add(first,"c","32");
     add(first,"a","fd11f");

    bucket * p=first;
    while(p!=NULL)
    {
        fprintf(stdout,"%d\n",p->key);

        if(p->value!=NULL)
        {
            list * node_l=p->value;
            while(node_l!=NULL)
            {
                fprintf(stdout,"%s\t",node_l->value);
                node_l=node_l->next;
            }
            fprintf(stdout,"\n");
        }
        p=p->next;
    }
     fprintf(stdout,"\n");
}
阅读 1.7k
1 个回答
bucket * first=(bucket *)my_malloc(B_MAX*size_b);//我的理解是你想要5个bucket结构,所以申请5个bucket大小的内存空间
for(int i=0;i<B_MAX;i++)
    {
        bucket * loc=(first+i);//但是这里first+i*size_b这样才能到bucket[0],bucket[1]...的起始地址,
        if(i==B_MAX-1){
            loc->next=NULL;
        }else{
            loc->next=loc+1;
        }

        if(i==0){
            loc->previous=NULL;
        }else{
            loc->previous=loc-1;
        }

        loc->key=i;
        loc->value=NULL;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏