• c 实现字符串反转(参考redis源码)


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct _dys
    {
        unsigned int len;
        unsigned int free;
        char buf[];
    }dys;
    char *dynewlen(const void *prt,size_t initlen)
    {
        dys *ds=NULL;
        if(prt)
        {
            ds=(dys *)malloc(sizeof(*ds)+initlen+1);
        }
        else
        {
            ds=(dys *)calloc(sizeof(*ds)+initlen+1,1);
        }
        ds->len=initlen;
        ds->free=0;
        if(prt&&initlen)
        {
            memcpy(ds->buf,prt,initlen);
        }
        ds->buf[initlen]='';
        return (char *)ds->buf;
    }
    char *dyreverse(const void *prt,size_t initlen)
    {
        dys *ds=NULL;
        if(prt)
        {
            ds=(dys *)malloc(sizeof(*ds)+initlen+1);
        }
        else
        {
            ds=(dys *)calloc(sizeof(*ds)+initlen+1,1);
        }
        ds->len=initlen;
        ds->free=0;
        int i;
        if(prt&&initlen)
        {
            for(i=initlen;i>=1;i--)
            {
                memcpy((char *)&ds->buf[initlen-i],(prt+i-1),1);
            }
        }
        ds->buf[initlen]='';
        return (char *)ds->buf;
    }
    int main(void)
    {
        char *s="hello,123";
        int i,slen=strlen(s),j;
        dys *args[1024]={NULL};
        char *prt=NULL;
        printf("###############normal##################
    ");
        for(i=0;i<=slen;i++)
        {
            prt=dynewlen(s,i);
            args[i]=(dys *)(prt-sizeof(dys));
            printf(" i =%d, s= %s,len=%d
    ",i,prt,args[i]->len);
        }
        j=i;
        printf("################reverse##################
    ");
        for(i=0;i<=slen;i++)
        {
            prt=dyreverse(s,i);
            args[i+j]=(dys *)(prt-sizeof(dys));
            printf(" i =%d, s= %s,len=%d
    ",i+j,prt,args[i+j]->len);
        }
        for(i=0;i<1024;i++)
        {
            if(args[i]!=NULL)
            {
                printf(" can free args[%d] addr =%p
    ",i,args[i]);
                free(args[i]);
                args[i]=NULL;
            }
        }
        return 0;
    }


    运行结果:

    [mysql@centos2 sredis]$ ./a.out
    ###############normal##################
     i =0, s= ,len=0
     i =1, s= h,len=1
     i =2, s= he,len=2
     i =3, s= hel,len=3
     i =4, s= hell,len=4
     i =5, s= hello,len=5
     i =6, s= hello,,len=6
     i =7, s= hello,1,len=7
     i =8, s= hello,12,len=8
     i =9, s= hello,123,len=9
    ################reverse##################
     i =10, s= ,len=0
     i =11, s= h,len=1
     i =12, s= eh,len=2
     i =13, s= leh,len=3
     i =14, s= lleh,len=4
     i =15, s= olleh,len=5
     i =16, s= ,olleh,len=6
     i =17, s= 1,olleh,len=7
     i =18, s= 21,olleh,len=8
     i =19, s= 321,olleh,len=9
     can free args[0] addr =0x13d3010
     can free args[1] addr =0x13d3030
     can free args[2] addr =0x13d3050
     can free args[3] addr =0x13d3070
     can free args[4] addr =0x13d3090
     can free args[5] addr =0x13d30b0
     can free args[6] addr =0x13d30d0
     can free args[7] addr =0x13d30f0
     can free args[8] addr =0x13d3110
     can free args[9] addr =0x13d3130
     can free args[10] addr =0x13d3150
     can free args[11] addr =0x13d3170
     can free args[12] addr =0x13d3190
     can free args[13] addr =0x13d31b0
     can free args[14] addr =0x13d31d0
     can free args[15] addr =0x13d31f0
     can free args[16] addr =0x13d3210
     can free args[17] addr =0x13d3230
     can free args[18] addr =0x13d3250
     can free args[19] addr =0x13d3270
    
    
    
     
  • 相关阅读:
    Linux一些工具命令
    IDC运维_2
    计算机网络基础_1
    Shell编程基础2
    Shell编程进阶3
    注销无效的vcenter/vcsa
    Dapper中,针对MySQL的Like参数化查询
    墨天轮访谈 | 拓扑岭雷鹏:数据库新思维下的弹性压缩与内存计算
    九问 GBase | 如何看待“科技制裁”?如何助力中国数据库国产化落地?
    墨天轮访谈 | 百度云邱学达:GaiaDB如何解决云上场景的业务需求?
  • 原文地址:https://www.cnblogs.com/innobase/p/4710901.html
Copyright © 2020-2023  润新知