我是靠谱客的博主 外向飞鸟,最近开发中收集的这篇文章主要介绍C99灵活数组这玩意称为[灵活数组],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近在研究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[]; 这个是不占用内存的

183153_ed2u_2338224.png

这玩意称为[灵活数组]

灵活数组是添加到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] = '';
printf("%sn",p_sdshdr1->buf);
return 0;
}

运行结果:

8
ab

 

转载于:https://my.oschina.net/u/2338224/blog/1798662

最后

以上就是外向飞鸟为你收集整理的C99灵活数组这玩意称为[灵活数组]的全部内容,希望文章能够帮你解决C99灵活数组这玩意称为[灵活数组]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部