在c99的标准中,允许结构体的最后一项是大小不不确定的数组即arr[]或arr[0],且柔性数组前面必须至少有一个成员。
typedef struct s
{
int n;
int arr[];
}S;
int main()
{
int i=0;
S*ps=(S*)malloc(sizeof(S)+5*sizeof(int));
ps->n=100;
for (i=0;i<5;i++)
{
ps->arr[i]=i;
}
for (i=0;i<5;i++)
{
printf("%d",ps->arr[i]);
}
S*ptr=realloc(ps,44);
if(ptr!=NULL)
{
ps=ptr;
}
free(ps);
ps=NULL;
return 0;
}
其中注意对于realloc的使用,如果在之前malloc的区域中,后方的内存够用,便直接在malloc的内存区域后面追加内存,并返回旧的地址,如果内存不够,则会在另一区域开辟新的空间,并将就空间的数据拷贝到新空间,返回新的地址,并主动free到旧空间。
对于p=realloc(p,330000)/*330000是为了保证realloc在新的空间进行,而非进行追加*/
,如果realloc失败,则p会变成一个空指针,则p原本指向的旧空间也找不到了,数据丢失,所以一般用一个新的指针p2来进行realloc,并且注意检查realloc是否成功,使用完成后,注意free掉旧指针,并且置于NULL