struct中长度为0的数组用处与道理

    添加时间:2013-8-12 点击量:

    媒介


        在标准C和C++中,长度为0的数组是被禁止应用的。不过在GNUC中,存在一个很是新鲜的用法,那就是长度为0的数组,比如Array[0]; 很多人可能感觉不成思议,长度为0的数组是没有什么意义的,不过在这儿,它默示的美满是别的的一层意思, 这个特点是不成移植的, 所以,若是你致力于编写可移植,或者是稍稍须要跨平台的代码,这些Trick好还是收起来的好。


        本系列文章均系笔者所写,不免有一些错误或者忽略,若是小伙伴们有好的建议或者更好的算法,请不吝赐教。


    正文


        在GNU的指南中,它是如此写道:



    struct line {
    
    int length;
    char contents[0];
    };

    //...ommit code here

    {
    struct line thisline
    = (struct line ) malloc (sizeofstruct line) +this_length);
    thisline
    ->length = this_length;
    }


        这个用法首要用于变长Buffer,structline的大小为4,布局体中的contents[0]不占用任何空间,甚至是一个指针的空间都不占, contents在这儿只是默示一个常量指针,这个特点是用编译器来实现的,即在应用thisline->contents的时辰, 这个指针就是默示分派内存地址中的某块buffer,比如malloc(sizeof (struct line) +this_length)返回的是0 x8f00a40,thisline->contents指向的地位就是(0 x8f00a40+ sizeof(struct line)),而这儿sizeof(struct line)仅仅是一个int的四字节。


        对于这个用法,我们定义的布局体指针可以指向随便率性长度的内存buffer,这个技能在变长buffer中应用起来相当便利。可能有伴侣说,为什么不把最后的contents直接定义为一个指针呢?这儿的差别是如许的,若是定义为一个指针,它须要占用4Bytes,并且在申请好内存后必须工钱赋地址才可以。若是应用这个用法,这个常量指针不占用空间,并且无需赋值。 然则,便利并不是绝对的,在开释分派的内存的时辰,因为函数free会认为thisline只是指向一个4字节的指针,即只会开释length的空间,而对于后面占领大头的buffer却熟视无睹,这个就须要工钱干涉干与;而对于后面的声明指针的体式格式,则可以直接用Free(thisline->contents)的体式格式开释掉分派的内存。


        ASSERT:除非须要,不要随便马虎应用这个功能,GNUC下可以编译经由过程,所以你在应用vc++,那就不消测验测验了,编译都无法经由过程。


    作者


       出处:http://www.cnblogs.com/gina


       本文版权归作者所有,迎接转载,但未经作者赞成必须保存此段声明,且在文章页面明显地位给出原文连接,不然保存究查法令义务的权力。

    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: