该函数的功能就是新建立一个字符串,指针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()函数也能实现一样的效果。目前的水平还感受不出来源程序之因此那么写的原因,不过随着学习的深刻,会慢慢理解的。code
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字符串