柔性数组的使用:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
struct S
{
int i;
int a[];
};
int main()
{
struct S *s = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
//包含柔性数组的结构用malloc函数进行内存的动态化分配,并且分配的内存应该大于结构的大小,已以适应柔性数组的大小
if (s == NULL)
{
printf("%s\n", strerror(errno));
return;
}
s->i = 100;
for (int k = 0; k < 10; k++)
{
s->a[k] = k;
}
printf("扩容前,a有:");
for (int k = 0; k < 10; k++)
{
printf("%d ", s->a[k]);
}
stuct S*ptr = (struct S*)realloc(s,sizeof(struct S) + 20 * sizeof(int));
//这里柔性数组的大小可以通过realloc函数进行扩容。
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
s = ptr;
for (int k = 10; k < 20; k++)
{
s->a[k] = k;
}
printf("\n");
printf("扩容后,a有:");
for (int k = 0; k < 20; k++)
{
printf("%d ", s->a[k]);
}
free(s);
s = NULL;
return 0;
}
还有另一种方法和柔性数组的使用效果是一样的:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
struct S
{
int i;
int *a;
};
int main()
{
struct S *s = (struct S*)malloc(sizeof(struct S));
//首先为结构申请空间。
if (s == NULL)
{
printf("%s\n", strerror(errno));
return;
}
s->i = 100;
s->a = (int *)malloc(10 * sizeof(int));
//再开辟空间,直接让指针a指向这块空间就行了。
for (int k = 0; k < 10; k++)
{
s->a[k] = k;
}
for (int k = 0; k < 10; k++)
{
printf("%d ", s->a[k]);
}
printf("\n");
int* ptr = (int*)realloc(s->a,20 * sizeof(int));
//扩容直接让指针指向指向的空间进行扩容就行了,不需要让整个结构进行扩容。
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
s->a = ptr;
for (int k = 10; k < 20; k++)
{
s->a[k] = k;
}
for (int k = 0; k < 20; k++)
{
printf("%d ", s->a[k]);
}
free(s);
s = NULL;
free(s->a);
s->a = NULL;
return 0;
}
总结:
方案1:malloc一次free一次,容易维护空间,不易出错。而且malloc次数少意味着内存碎片就会比较少,内存的使用率就会较高一些。
方案2:malloc两次,free两次,维护难度加大,容易出错。malloc次数多,内存锁片就会增多,内存的使用率就下降了。