2019独角兽企业重金招聘Python工程师标准>>>

sdsnewlen()函数功能

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

源代码

sds sdsnewlen(const void *init, size_t initlen) {
>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;

}

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

修改后的sdsnewlen()

sds mysdsnewlen(const void *init,size_t initlen)
{
struct sdshdr *sh;
>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; }

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

malloc

函数原型

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

头文件

#include<malloc.h>或者
#include<stdlib.h>

calloc

函数原型

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

头文件

#include<stdlib.h>或者
#include<malloc.h>

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

realloc

函数原型

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

头文件

#include<stdlib.h>或者
#include<malloc.h>

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

转载于:https://my.oschina.net/u/1771419/blog/1619100

redis3.0.7_sds.c_sdsnewlen()相关推荐

  1. Redis3.0 配置文件说明

    背景: 以前有篇文章已经结果过了,现在复习一下,对Redis3.0进行说明: 参数说明: #redis.conf # Redis configuration file example. # ./red ...

  2. redis-3.0.2集群部署

    Redis 集群安装 集群搭建步骤 1.创建多个节点. 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群. 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态. 要求:搭建一个 ...

  3. CentOS7安装配置redis-3.0.0

    一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar ...

  4. redis3.0.0 集群安装详细步骤

    2019独角兽企业重金招聘Python工程师标准>>> redis3.0.0 集群安装详细步骤 博客分类: 缓存 Redis集群部署文档(centos6系统) (要让集群正常工作至少 ...

  5. redis3.0.2 编译安装 (启动服务方式启动)

    1.基础环境介绍: 操作系统:Centos 6.7 redis版本:3.0.2 2.开始安装: 1)基础安装 参考链接:http://309173854.blog.51cto.com/7370240/ ...

  6. Linux下Redis-3.0.7版本的安装以及Redis主备的部署(一)

    一.基本工具 (1)      虚拟机两台(做好快照) CentOS 6.6   192.168.1.146 CentOS 6.7   192.168.1.147 (2)      软件包 redis ...

  7. 【数据库】Ubuntu12.04安装配置Redis3.0

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  8. Redis3.0 集群

    1  Redis3.0集群 Redis3.0之前项目架构 转载于:https://blog.51cto.com/liuzedong/1663726

  9. redis3.0.2 分布式集群安装详细步骤

    redis3.0.2 分布式集群安装详细步骤 --(centos5.8 X64系统) 版本历史 时间 版本 说明 编写者 2015-06-5 1.0 redis3.0.2 分布式集群安装详细步骤 cs ...

最新文章

  1. leetcode数组汇总_LeetCode刷题:前言
  2. phantomjs执行常见错误
  3. 如何查看redhat社区的solution(或者订阅);redhat内容不全
  4. 城市不透水面空间分析——以宁波为例
  5. windows使用Charles手机抓包
  6. 深度学习在图像检索的应用
  7. 在Microsoft Workflow Foundation中晃荡了两天
  8. 【翻译】MobileWeb开发的性能调优技巧
  9. matlab从入门到放弃~
  10. 初级程序员考试大纲 (转)
  11. cdr软件百度百科_什么是CDR软件?
  12. delphi连接mysql不用添加dsn_Delphi]delphi中动态创建MySQL的ODBC连接 .
  13. 用于全市人群流动预测的深度时空残差网络
  14. 真无线蓝牙耳机哪个音质最好?2020高性价真无线蓝牙耳机音质排行榜!
  15. cocos2dx《我叫MT》源码和资源破解下载
  16. w7计算机删除图标不见了怎么办,win7小电脑图标不见了怎么办
  17. PyCharm许可证过期解决方案
  18. schedule for addition
  19. 同步电路和异步电路的区别
  20. 测绘工程本科生如何入门GNSS算法 - 引言

热门文章

  1. 单调队列优化和决策单调性优化
  2. centos安装Oracle virtual box
  3. display:table的几个用法
  4. 开发外包注意事项——iOS APP的开发
  5. GDB and core
  6. 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
  7. winform的UI设计关键属性汇总
  8. Android数据存储之SQLite
  9. C# winform中ListView用法
  10. 廖雪峰python教程菜鸟变高手_python怎样