redis3.0.7_sds.c_sdsnewlen()

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()函數也能實現一樣的效果。目前的水平還感受不出來源程序之因此那麼寫的原因,不過隨着學習的深刻,會慢慢理解的。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字符串

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息