还有就是见到了 struct aaa aaa1[0];
这样的格式同样发生在一个定义的结构最后面,是如何的意思呢,难道还是和上面的一样的,
同志们啊,还有什么理解没有呢。

解决方案 »

  1.   

    一个linux中间的struct 的定义中间的一部分,反正是用C写的,所以到这里问应该也不错。
      

  2.   

    好象这样也有利于char与CString型的转换
      

  3.   

    char a[0];应该是声明一个常量指针吧
      

  4.   

    这个用法遍地都是,有什么奇怪?
    它就是利用了c语言的一个特性:不对数组边界做检查。
    就比如DIB位图的头里面需要定义一个颜色表,但是你定义头结构的时候并不知道这个颜色表会有多大。如果这样定义:
    typedef struct tagBITMAPINFO { // bmi  
       BITMAPINFOHEADER bmiHeader; 
       RGBQUAD          bmiColors[1]; 
    } BITMAPINFO; 
    那么,编译器就会将bmiColors理解为属于BITMAPINFO的一个指向RGBQUAD的指针,以后当真正有数据读到内存后,你将内存的首地址转化为一个BITMAPINFO类型的指针,就可以直接存取bmiColors[25]这样的元素了,编译器是不会检查的。
      

  5.   

    To kiko_lee:我不知道在你所提到的环境中 char a[0] 和 char a[1]是否能起到相同效果。
    如果相同,则azuo_lee所举的例子很好的说明了这种用法,即:把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。既然azuo_lee说到了这种用法,而且是“这个用法遍地都是”。我想借此宝地向大家转述大师Stanley B.Lippman对此的看法。C程序员的巧计有时候却成为C++程序员的陷阱
    例如把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组:
         struct mumble{
           char pc[1];
         }     //从标准输入装置中取得一个字符串
         //然后为struct本身和该字符串分配足够的内存
         struct mumble *pmumbl =(struct mumble*)
                    malloc(sizeof(struct mumble)+strlen(string)+1);     strcpy(&memble.pc,string);如果我们改用class来声明,而该class是:
    #指定多个access sections,内含数据;
    #从另一个class派生而来;
    #定义有一个或多个virtual functions;那么以上用法或许可以顺利转化,但或许不行!C++中凡处于同一个access section的数据,必定保证以其声明的次序出现在内存布局中。然而被放置在多个access sections中的各笔数据,排列次序就不一定了。下面的声名中,前述的C伎俩或许可以有效运行,或许不能,需视protected data members被放在private data members的前面或后面(放在前面才可以):
        class strumble{
        public:
            // operations ...
        protected:
            // protected stuff
        private:
            // privated stuff
            char pc[1];
        };... ...所以最好的忠告就是:不要那么做。以上内容摘自《深度探索C++对象模型》,仅供参考。