概述
2019独角兽企业重金招聘Python工程师标准>>>
最近在研究redis源码 ,其中SDS里面的2个函数给我整懵逼了 (redis源码是C99标准写的)
如下
#define __SDS_H
#define SDS_MAX_PREALLOC (1024*1024)
#include <sys/types.h>
#include <stdarg.h>
typedef char *sds;
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
//
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->len;
}
static inline size_t sdsavail(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->free;
}
这个
s-(sizeof(struct sdshdr)
我愣是没看出来到底等于多少, 原来就是等于2个无符号int相加的值 .
char buf[]; 这个是不占用内存的
这玩意称为[灵活数组]
灵活数组是添加到C99新特性,称之为incompleted type,不完全类型,俗称零数组(zero array),查询了资料,做了实验,做个笔记
//
//
main.c
//
xpro
//
//
Created by admin on 2018/4/20.
//
Copyright © 2018年 admin. All rights reserved.
//
/**
zero array 的代码示例
*/
#include <stdio.h>
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
int main(int argc, const char * argv[]) {
printf("%ldn",sizeof(struct sdshdr));
const char s[2] = {'1','2'};
struct sdshdr *p_sdshdr1;
p_sdshdr1 = (struct sdshdr *)malloc(sizeof(unsigned int)*2 + 3);
p_sdshdr1->buf[0] = 'a';
p_sdshdr1->buf[1] = 'b';
p_sdshdr1->buf[2] = '