Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2307694
  • 博文数量: 395
  • 博客积分: 10994
  • 博客等级: 上将
  • 技术积分: 5586
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 19:49
文章存档

2014年(1)

2013年(10)

2012年(74)

2011年(303)

2010年(7)

分类: C/C++

2011-10-27 11:26:15

前沿:一直以来就有一种想法,就是定义一个结构体,其中只有两个指针,一个事next,另一个也是个指针,指向一个不固定大小的空间,这个空间是malloc来分配的。。。这样的话就可以摆脱了这样一种限制---->(结构体中的信息实体是用一个数组来实现,但是经常为为这个数组定义的时候下标是多大而发愁。)结构体如下:
typedef struct kbuff_list
{
        char *Pmalloc_buff;   
        struct  kbuff_list *next;
}KBUFF; 

下面贴个图表示一下:
验证程序如下(不过为了能够在打印的时候能够看出来,我在结构体中加上了一个flag)
#include
#include
#include
#include
#include
#include
#include
#include

#define DEBUG

#ifdef DEBUG
#define DBG(x...)       printf(x)
#else
#define DBG(x...)
#endif

#define flag_p 1
typedef struct kbuff_list
{
#if 1
        char *Pmalloc_buff;
#else
        char buff_node[20];
#endif
        int flag; 
        struct  kbuff_list *next;
}KBUFF; 
KBUFF *pread_kbuff,*pirq__kbuff;
unsigned long list_cnt;

sem_t sem;

void readThread(){
        KBUFF *p1;
        char *p_malloc_buff;
        while(1){
                sem_wait(&sem);
                if(pread_kbuff !=NULL){
                        p1=pread_kbuff;
#if 1
                        p_malloc_buff=p1->Pmalloc_buff;
                        DBG("the pread_kbuff->Pmalloc is %s,flag is %d\n",pread_kbuff->Pmalloc_buff,pread_kbuff->flag);
                        pread_kbuff=pread_kbuff->next;
                        free(p_malloc_buff);
                        free(p1);
#else
                        DBG("the pread_kbuff->buff_node is %s,flag is %d\n",pread_kbuff->buff_node,pread_kbuff->flag);
                        pread_kbuff=pread_kbuff->next;
                        free(p1);
#endif
                }
        }
        pthread_exit(NULL);
}

KBUFF init_kbuff_list(){
        list_cnt=0;
        pread_kbuff=pirq__kbuff=NULL;
        sem_init(&sem,0,0);
}

void main()
{
        int ret;
        KBUFF *p1,*p2;
        char kbuffer[20]="zhangfei is best";
        pthread_t id1;
        int USER_SIZE;
        int i=0;
        init_kbuff_list();

        ret = pthread_create(&id1, NULL, (void*)readThread, NULL);
        if(ret!=0){
              perror("Thread join failed");
              exit(EXIT_FAILURE);
        }
        list_cnt++;
        while(1){
                p2=p1=(KBUFF *)malloc(sizeof(KBUFF));
                //DBG("the malloc KBUFF is %d\n",sizeof(KBUFF));
                USER_SIZE=15;
#if 1
                p1->Pmalloc_buff=(char *)malloc(USER_SIZE*sizeof(char));
                memcpy(p1->Pmalloc_buff,kbuffer,USER_SIZE);
#else
                memcpy(p1->buff_node,kbuffer,USER_SIZE);
#endif
                p1->flag=list_cnt;
                if(list_cnt==1 || pread_kbuff == NULL){
                        pirq__kbuff=pread_kbuff=p1;
                        printf("the code get %ldth here\n",list_cnt);
                }
                else
                        pirq__kbuff->next=p1;
                p1->next=NULL;
                pirq__kbuff=p1;
                sem_post(&sem);
                list_cnt++;
                if(list_cnt==65536)
                        list_cnt=2;
                DBG("this is the %s-> %d.the flag is %ld\n",__FUNCTION__,__LINE__,list_cnt);
                i++;
                if(i == 10) i=0;
                usleep(1);
        }
}

解析:
1.对于上面这个结构体:这个结构体中的那个flag是没有实际用处的,就是调试方便。。。
这个*next不用说了,来连接链表用的。。。
而这个Pmalloc_buff是用来指向那个不确定大小信息的。
就行在main中的while(1)中的那样:
p2=p1=(KBUFF *)malloc(sizeof(KBUFF));这是先对这个结构体分配堆空间,然后 
p1->Pmalloc_buff=(char *)malloc(USER_SIZE*sizeof(char));是对这个结构体中的那个指针指向的不确定大小空间分配空间(这个不确定性就是这里面的USER_SIZE来表示的)。。。

2.如何把那个#if 1编程#if 0,这个时候是是用数组来分配空间,这个时候分配的就是固定的了(因为数组定义的时候已经固定了)

3.编译的时候用这个:gcc -o net_proj net_proj.c -lpthread,因为其中创建了线程,并且,可能这个#include你找不到,我用的是ubuntu系统,这个时候就查找你的/usr/src/linux(kernel)/include下是不是有semaphore.h,这个我就不多说了,是linux的基本问题了。

4.经过反复验证,这种方法是可行的,开始一直有一个错误:free(): invalid next size (fast): 0x093df0c8,是因为这个malloc有问题(因为先前用的是p1->Pmalloc_buff=(char *)malloc(sizeof(USER_SIZE));这是不对的,要记住)。


阅读(4117) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~