在前面的文章中的dnw源代码,使用了这样一个结构体:
struct download_buffer {
uint32_t load_addr; /* load address */
uint32_t size; /* data size */ //size=地址(4位)+大小(4位)+数据+校验(2位)
uint8_t data[0];//0长度数组,指向数据
/* uint16_t checksum; */ //数组后紧接着的两位是校验位
};
分配内存空间:
buffer = alloc_buffer(file_stat.st_size);
buffer = malloc(data_size + sizeof(struct download_buffer) + 2);
data_size是结构体成员buffer->data的长度,使用sizeof(struct download_buffer)取得结构体长度时,不计算
data成员的长度,这样就实现了一个可以动态调节大小的结构体,根据所需要的空间分配给data成员空间。
再来看一个网上的例子:
定义一个结构体
typedef struct user_def
{
char * name;
int length;
char bytes[0];
} user_def_t;
int alloc_user_def_t(user_def_t * p, int length)
{
p = (user_def_t)malloc(sizeof(user_def_t) + length);
if (NULL == p)
{
return -1;
}
p->name = NULL;
p->length = length;
memset(p->bytes, 0, length);
return 0;
}
#include
#include
#include
#include
struct helloworld_t
{
int num;
char helloworld[0];//主要是用来得到一个数组的地址,再由数组的个数来访问
};
int main()
{
struct helloworld_t *p;
unsigned int size = sizeof(struct helloworld_t) + strlen("Hello World!\n") + 1;
p = (struct helloworld_t *) malloc(size);
assert(p!=NULL);
memcpy(p, "\x01\x00\x00\x00Hello World!\n", size);//\x01\x00\x00\x00四字节,就是给num赋值
//在内存中高8位和低8位反一下...
// printf("%d\n",p->num);
while (p->num--)
{
printf(p->helloworld);
}
//printf("%d \n", sizeof(helloworld_t));
free((void *)p);
return 0;
}
举个例子:
typedef struct st_type
{
int i;
int a[0];
}type_a;
typedef struct st_type
{
int i;
int a[];
}type_a;
struct ptest
{
int a;
double b;
char *c;
};