c柔性数组

一 , 定义

C99及以上标准支持
标准示例如下:

typedef struct st_type
{
int i;
int a[];
}type_a;

初始大小为sizeof(i),0个元素的数组没有占用空间,而后我们可以进行变长操作了。
通过如下表达式给结构体分配内存:
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));

但是这时候我们再用 sizeof(*p)测试结构体的大小,发现仍然为 4

因为在定义这个结构体的时候,模子的大小就已经确定不包含柔性数组的内存大小。柔性数组只是编外人员,不占结构体的编制。只是说
在使用柔性数组时需要把它当作结构体的一个成员,仅此而已。再说白点,柔性数组其实与
结构体没什么关系,只是“挂羊头卖狗肉”而已,算不得结构体的正式成员
.???? 待验证

二, 对比

typedef struct st_type
{
int i;
int a*;
}type_a;

将a[]修改为a*, 此时a只是一个指针, 只是占用结构体8个字节的大小(即一个指针内存大小)

相比较, 使用柔性数组的好处

第一个意义是,方便内存释放。如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。(读到这里,你一定会觉得C++的封闭中的析构函数会让这事容易和干净很多)

第二个原因是,这样有利于访问速度。连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正你跑不了要用做偏移量的加法来寻址)

三,  一个示例

#include <stdio.h>
struct str{
    int len;
    char s[0];
};
 
struct foo {
    struct str *a;
};
 
int main(int argc, char** argv) {
    struct foo f={0};
    if (f.a->s) {
        printf("%x\n", f.a->s);
    }
    return 0;
}

程序输出:4。 这下你知道了printf(f.a->s)是访问0x4的内存地址.

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/87874552