redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明
來源:懂視網(wǎng)
責編:小采
時間:2020-11-09 15:10:04
redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明
redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明:在redis源碼sds.h中對于字符串結構體的定義如下:typedef char *sds;struct sdshdr { int len; int free; char buf[];};這里剛開始沒有看明白char buf[]是什么個形式,不是說C語言里數(shù)組必須要初始化大小嗎?那么這里是什么東西?我們先用一個簡單的方法來查
導讀redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明:在redis源碼sds.h中對于字符串結構體的定義如下:typedef char *sds;struct sdshdr { int len; int free; char buf[];};這里剛開始沒有看明白char buf[]是什么個形式,不是說C語言里數(shù)組必須要初始化大小嗎?那么這里是什么東西?我們先用一個簡單的方法來查

在redis源碼sds.h中對于字符串結構體的定義如下:typedef char *sds;struct sdshdr { int len; int free; char buf[];};這里剛開始沒有看明白char buf[]是什么個形式,不是說C語言里數(shù)組必須要初始化大小嗎?那么這里是什么東西?我們先用一個簡單的方法來查
在redis源碼sds.h中對于字符串結構體的定義如下:
typedef char *sds;
struct sdshdr {
int len;
int free;
char buf[];
};
這里剛開始沒有看明白char buf[]是什么個形式,不是說C語言里數(shù)組必須要初始化大小嗎?那么這里是什么東西?
我們先用一個簡單的方法來查看一下結構體sdshdr的大小:
#include
struct sds
{
int val;
int size;
char name[];
};
int main()
{
printf("%d\n",sizeof(sds));
return 0;
}
我們發(fā)現(xiàn)輸出結果是8字節(jié),也就是說char name[]是不占空間的,這里我們可以把它看成一個占位符。
struct Database
{
char Name[];
};
這種結構體聲明倒是對的,最新的C標準支持這種寫法,但是,初始化它就沒這么簡單了,前面還沒有一個人說對正確的初始化辦法呢
并且,這個東西的初始化,只能手工,先用malloc(sizeof(struct Database) + size);
其中size是你希望的Name的長度,然后你只能用strcpy這樣的方式初始化了
上面是查找到的資料,實際上這里可以把char buf[]看成一個指針,在struct默認只是占用了指針的空間而已,而不占用實際的存儲空間,相反,在生成該結構體實例的時候,才進行空間分配。在redis中空間分配的函數(shù)在sds.c中:
sds sdsnewlen(const void *init, size_t initlen) {
struct sdshdr *sh;
if (init) {
sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
} 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;
}
我們從上述代碼可以看出, sh = zmalloc(sizeof(struct sdshdr)+initlen+1);這句話就是根據(jù)傳進來的參數(shù)來申請內存,當然,申請的內存是大于存放字符串的空間的,因為要申請額外的空間用來存放 int len;int free; 兩個變量,也就是sizeof(struct sdshdr),其中+1是用來存放表示字符串結束的'\0'。
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明
redis數(shù)據(jù)庫中的sds.h中字符串數(shù)組的一個說明:在redis源碼sds.h中對于字符串結構體的定義如下:typedef char *sds;struct sdshdr { int len; int free; char buf[];};這里剛開始沒有看明白char buf[]是什么個形式,不是說C語言里數(shù)組必須要初始化大小嗎?那么這里是什么東西?我們先用一個簡單的方法來查