前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis3.0.7_sds.c_sdsnewlen()

redis3.0.7_sds.c_sdsnewlen()

作者头像
青木
发布2018-05-28 15:34:37
4150
发布2018-05-28 15:34:37
举报

sdsnewlen()函数功能

该函数的功能就是新创建一个字符串,指针init指向字符串的开头。initlen指定字符串的长度。 并且规定,无论字符串是否为空,字符串的末尾都用'\0'结尾。在C语言中,一个字符串数组的结尾默认是用'\0'表示结束得。当遇到'\0'时,就表示已经到达数组末尾。

源代码

代码语言:javascript
复制
sds sdsnewlen(const void *init, size_t initlen) {
代码语言:javascript
复制
>struct sdshdr *sh;
>if (init) {
   > sh = zmalloc(sizeof(struct sdshdr)+initlen+1);//+1的目的是为了存储“\0”
>} else {
  >  sh = zcalloc(sizeof(struct sdshdr)+initlen+1);
>}
>if (sh == NULL) return NULL;
>sh->len = initlen;
>sh->free = 0;
>if (initlen && init)
   > memcpy(sh->buf, init, initlen);
>sh->buf[initlen] = '\0';
>return (char*)sh->buf;

}

代码语言:javascript
复制

因为原函数中的zmalloc()函数和zcalloc()函数的具体实现比较复杂,所以为了先能更好的理解sdsnewlen()函数的功能,下面我将源代码中的zmalloc()和zcalloc()进行替换。

修改后的sdsnewlen()

代码语言:javascript
复制
sds mysdsnewlen(const void *init,size_t initlen)
{
struct sdshdr *sh;
代码语言:javascript
复制
>if(init)

{ > sh = (void*)malloc(sizeof(struct sdshdr)+initlen+1); >} >else >{ > sh = (void*)calloc(sizeof(struct sdshdr)+initlen+1,1); >} >if(sh == NULL) return NULL; >sh->len = initlen; >sh->free = 0; >if(initlen && init) >{ > memcpy(sh->buf,init,initlen); >} return (char*)sh->buf; }

代码语言:javascript
复制

修改后的sdsnewlen()函数也能实现同样的效果。目前的水平还感觉不出来源程序之所以那么写的缘由,不过随着学习的深入,会慢慢理解的。

malloc

函数原型

代码语言:javascript
复制
void *malloc(size_t size); 
//向系统申请分配指定size个字节的内存空间,size是一个无符号数
//返回类型为void*,表示不确定返回类型的指针。也就是说,返回
类型的指针可以被强制转换成任意类型的指针。

头文件

代码语言:javascript
复制
#include<malloc.h>或者
#include<stdlib.h>

calloc

函数原型

代码语言:javascript
复制
void *calloc(size_t n, size_t size);
//在内存的动态存储区域区中分配n个长度为size的连续存储空间
//函数返回一个指向分配起始地址的指针,如果分配不成功,则
返回NULL

头文件

代码语言:javascript
复制
#include<stdlib.h>或者
#include<malloc.h>

calloc在动态分配完成后,自动初始化该内存空间为0,而malloc并>不进行初始化,分配的内存中都是随机的垃圾数据。

realloc

函数原型

代码语言:javascript
复制
extern void *realloc(void *mem_address, unsigned int newsize);
//先判断当前的指针是否有足够的连续空间,如果有,
//扩大mem_address指向的地址,并且将mem_address返回,
//如果空间不够,先按照newsize指定的大小分配空间,
//将原有数据从头到尾拷贝到新分配的内存区域,
//而后释放原来mem_address所指内存区域
//(注意:原来指针是自动释放,不需要使用free),
//同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

头文件

代码语言:javascript
复制
#include<stdlib.h>或者
#include<malloc.h>

如果地址分配成功,则返回被分配内存的指针,否则返回空指针NULL

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sdsnewlen()函数功能
  • 源代码
  • 修改后的sdsnewlen()
  • malloc
    • 函数原型
      • 头文件
      • calloc
        • 函数原型
          • 头文件
          • realloc
            • 函数原型
              • 头文件
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档