前言

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

欢迎关注个人主页:逸狼

创造不易,可以点点赞吗~

如有错误,欢迎指出~

目录

前言

柔性数组

柔性数组的特点

柔性数组的使用

不使用柔性数组

柔性数组

如下代码int a[0]就是柔性数组

struct st_type

{

int i;//柔性数组前面至少要有一个其他成员

int a[0];//柔性数组成员

//int a[];

};

柔性数组的特点

结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。sizeof返回的这种结构⼤⼩不包括柔性数组的内存。包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

柔性数组的使用

使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。

struct st

{

int a;

int arr[];

};

int main()

{//用结构体指针变量ps接收malloc函数分配空间的地址

struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));

// malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)

//判断

if (ps == NULL)

{

return 1;

}

//使用

ps->a = 100;

for (int i = 0; i < 10; i++)

{

ps->arr[i] = i;

}

//若数组空间不够

//用realloc函数重新分配

struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));

if (ptr != NULL)

{

ps = ptr;//再次赋值给ps

}

else

{

perror("realloc");

}

//继续使用

for (int i = 0; i < 15; i++)

{

ps->arr[i] = i;

}

//打印

for (int i = 0; i < 15; i++)

{

printf("%d ",ps->arr[i]);

}

//释放

free(ps);

ps = NULL;

return 0;

}

对比 不使用柔性数组

不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间

#include

#include

struct st

{

int a;

int* arr;

};

int main()

{//用结构体指针变量ps接收malloc函数分配空间的地址

struct st* ps = (struct st*)malloc(sizeof(struct st));

//判断

if (ps == NULL)

{

return 1;

}

//使用

ps->a = 100;

//再次使用malloc函数给数组arr开辟空间

ps->arr = (int*)malloc(10 * sizeof(int));

if (ps->arr == NULL)

{

perror("malloc-2");

return 1;

}

//使用

for (int i = 0; i < 10; i++)

{

ps->arr[i] = i;

}

//数组空间不够

// 利用realloc函数扩大

int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));

if (ptr == NULL)

{

perror("realloc");

return 1;

}

else

{

ps->arr = ptr;

}

//初始化前15个元素

for (int i = 0; i < 15; i++)

{

ps->arr[i] = i;

}

//打印

for (int i = 0; i < 15; i++)

{

printf("%d ", ps->arr[i]);

}

//释放

free(ps->arr);

ps->arr = NULL;

free(ps);

ps = NULL;

return 0;

}

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: