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) 4,
sizeof(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;