Cフレキシブル配列

21946 ワード

フレキシブル配列メンバー
    

1、                ,sizeof                   。

2、              malloc()           。             。

3、       

typedef strcut type

{

 int i;

 int a[];

}type_a;

4、type_a *p=(type_a *)malloc(sizeof(type_a)+100*sizeof(int));

5、p->a[n]      。

6、free    

 

struct                    ,                 。            malloc()           ,                。

 

sizeof(type)  4.

type *p= (type*)malloc(sizeof(type)+100*sizeof(int));

p->a[n]        。
           ,            (incomplete type)。            ,                      。

 

6.2.5 Types

 

incomplete types (types that describe objects but lack information needed to determine their sizes).

 

C C++              。

 

                ,                   。                       ,              。                :

 

class base;

 

struct test;

 

base test      ,      。                 ,           ,             ,                ,  base test  。

 

                 :

 

extern int a[];

 

extern    ,         ,        。                        ,                 :

 

int a[] = { 10, 20 };

 

      (flexible array member)         ,       C             。                  。       ,                      ,     ,              ,                     ,  :

struct test

{

       int a;

       double b;

       char *p;

};

 

p     。                 ,     ,                ,     ?  ,          :

 

char a[] = “hello world”;

struct test *PntTest = ( struct test* )malloc( sizeof( struct test ) + strlen( a ) + 1 );

strcpy( PntTest + 1, a );

 

    ,( char* )( PntTest + 1 )     “hello world”    。   p       ,    。  ,          :    ( char* )( PntTest + 1 )   。          ,          ,          ,    ,                        ,           0               。  ,C/C++           0   ,  ,       0                 ,  :

 

struct test

{

       int a;

       double b;

       char c[0];

};

 

c        ,   PntTest               ,c                  ,        。c    0,      test   ,  PntTest->c  “hello world”    ,      ( char* )( PntTest + 1 )        。

 

                ,C99          :

 

6.7.2.1 Structure and union specifiers

 

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.

 

C99               ,        :

 

struct test

{

       int a;

       double b;

       char c[];

};

 

c     test   ,           ,               。                ,              ,  :

 

struct test

{

       int a;

       double b;

       float c[];

};

 

          ,  C99   ,        。     char a[1],        ,    a               ,  C/C++                ,            ,                 ,     。
       :       ,           ,       x byte      ,            x byte        ,             ?



     :        ,             ,           ,               ,        ,                  ,    :

[html] view plaincopyprint?

typedef struct node_s {  

    int type;        /**/  

    int len;         /**/  

    char value[0];   /**/  

} node_t;  

  ,                     :                char  。



 sizeof(node_t)    ,            。







             ?



1,   :



[cpp] view plaincopyprint?

#define MAX_INFO_SIZE (x - sizeof(node_t))  

[cpp] view plaincopyprint?

node_t *nodeinfo;  

char *mark;  

node_info = (node_t *)malloc(sizeof(node_t) + MAX_INFO_SIZE);  

if (node_info == NULL) {  

    mem_error();  

}  

[cpp] view plaincopyprint?

memset(node_info, 0, sizeof(node_t) + MAX_INFO_SIZE);  

node_info->type = your_type;  

node_info->len = 0;  

mark = &node_info->value;  





  :      ,   ,        mark  value  ,       ,  len 0;



2,    



[cpp] view plaincopyprint?

for (data = x; data < y; data = next(x)) { <span style="white-space:pre">    </span>/**/  

    len = get_data_len(data);  

    if (node_info->len + len <= MAX_INFO_SIZE) {  

        memcpy(mark, data, len);  

        mark += len;  

        node_info->len += len;  

    } else {  

        send(node_info); <span style="white-space:pre">         </span>/**/  

  

        memset(node_info, 0, sizeof(node_t) + MAX_INFO_SIZE);  

        node_info->type = your_type;  

        node_info->len = 0;  

        mark = &node_info->value;  

        memcpy(mark, data, len);  

        mark += len;  

        node_info->len += len;   

    }  

}  

send(node_info); <span style="white-space:pre">             </span>/*           */  





         :         ,       ,           。            ,      ,        。



  ,     x byte         data  ,                 。



 “     ”         x byte    ,          data    ?



3,    



              ,         data   ,    ?



[cpp] view plaincopyprint?

node_t *node_info;  

char *buf;  

int len;  

node_t *node_info;  

get_info(node_info);         /*  node_info        x byte    ,    */  

for (buf = node_info->value; buf < node_info->value + node_info->len; buf += len) {  

    data = (data_t *)buf;    /*           data */  

    op(data);                /**/  

    len = get_data_len(data);   

}  





  ,             ,     ,  ,         !



        ,          ,                      ,       。





             ,      :



          0           ?    C99   ?
c99        



  :2012-09-07 13:18  :Internet   :Internet   : 



 

           ,            (incomplete type)。            ,                      。 6.2.5 Types inco

           ,            (incomplete type)。            ,                      。



6.2.5 Types



incomplete types (types that describe objects but lack information needed to determine their sizes).



 



C C++              。



 



                :



class base;



struct test;



 



base test      ,      。                 ,           ,             ,                ,  base test  。



 



                 :



extern int a[];



 



extern    ,         ,        。                        ,                 :



int a[] = { 10, 20 };



 



      (flexible array member)         ,       C             。                  。       ,                      ,     ,              ,                     ,  :



 



struct test



{



       int a;



       double b;



       char *p;



};



 



p     。                 ,     ,                ,     ?  ,          :



 



char a[] = “hello world”;



 



struct test *PntTest = ( struct test* )malloc( sizeof( struct test ) + strlen( a ) + 1 );



strcpy( PntTest + 1, a );



 



    ,( char* )( PntTest + 1 )     “hello world”    (    p)。   p       ,    。  ,          :    ( char* )( PntTest + 1 )   。          ,          ,          ,    ,                        ,           0               。  ,C/C++           0   ,  ,       0                 ,  :



 



struct test



{



       int a;



       double b;



       char c[0];



};



 



c        ,   PntTest               ,c                  ,        。c    0,      test   ,  PntTest->c  “hello world”    ,      ( char* )( PntTest + 1 )        。



 



                ,C99          :



6.7.2.1 Structure and union specifiers



 



As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.



 



C99               ,        :



 



struct test



{



       int a;



       double b;



       char c[];



};



 



c     test   ,           ,               。                ,              ,  :



 



struct test



 



{



       int a;



       double b;



       float c[];



};



 



          ,  C99   ,        。     char a[1],        ,    a               ,  C/C++                ,            ,                 ,     。



 



 



           ?     :



typedef struct st_type



{



int i;



int a[0];



}type_a;



                :



typedef struct st_type



{



int i;



int a[];



}type_a;



                  ,  sizeof(type_a)      4sizeof(i)=sizeof(int)。   0             ,             。 

              :

type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));           p        。  p->item[n]            。

          sizeof(*p)        ,      4。      ?  

             ?

  ,            “  ” 。           ,      

                。          ,        。   

                      ,    。    ,       

        ,  “      ”  ,           。

      :C89       ,C99             。  ,C99

      incomplete type,    zero array,   int item[0];        ,C99         int item[];          int item[0];          ,   C99                ,C99    ,             。  ,      malloc       ,       free       :

free(p);

       ,                     。       

      ,         。



 



 



【        



  C99 ,                    ,          ,                       。                      。sizeof                   。            malloc ()           ,                ,            。】



 



C   :



type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));



C++   :



type_a *p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];



 



       :



C   :



free(p);



C++   :



delete []p;