日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis3.0.7_sds.c_sdsnewlen()

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis3.0.7_sds.c_sdsnewlen() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。