C99灵活数组

最近在研究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("%ld\n",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] = '\0';
    
    
    printf("%s\n",p_sdshdr1->buf);

    return 0;
}

运行结果:

8
ab

猜你喜欢

转载自my.oschina.net/u/2338224/blog/1798662