本次讲的是,柔性数组,如果哪位小博客想要了解的更多,可以登录下面这个网站,了解详细内容
C语言结构体里的成员数组和指针 | 酷 壳 - CoolShellhttps://coolshell.cn/articles/11377.html
- 我们就听说过数组,听说过柔性数组吗?柔性数组建立在结构体中,最后一个成员(是数组)并且没有指定大小。这就叫:柔性数组。它的标准代码为:
//柔性数组 struct S { char c; int a; int arr[];//柔性数组没有指定大小 };
这个就是柔性数组的基本表达。
-
柔性数组的特点:1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配 的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。
它的代码为:
//柔性数组的特点
struct S
{
int a;
int arr[];
};
int main()
{
printf("%zd\n", sizeof(struct S));
return 0;
}
打印的数字是4,这就说明,柔性数组不包含它自己本身的大小,而是它前一个数的大小。
-
柔性数组的使用:我们先直接上代码,然后在分析,则代码为:
//柔性数组的使用 struct S { int a; int arr[]; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int)); if (ps == NULL) { perror("malloc"); return 1; } ps->a = 100; int i = 0; for (i = 0; i < 5; i++) { ps->arr[i] = i; } //调整空间 struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 10 * sizeof(int)); if (ptr != NULL) { ps = ptr; } //释放 free(ps); ps = NULL; return 0; }
对于这第一种代码,就是把内存放在堆上,还有第二种代码,我们来比较一下,看看哪种代码更容易被接受,则代码二为:
#include <stdio.h> #include <stdlib.h> typedef struct st_type { int i; int* p_a; }type_a; int main() { type_a* p = (type_a*)malloc(sizeof(type_a)); p->i = 100; p->p_a = (int*)malloc(p->i * sizeof(int)); //业务处理 for (i = 0; i < 100; i++) { p->p_a[i] = i; } //释放空间 free(p->p_a); p->p_a = NULL; free(p); p = NULL; return 0; }
你们说这两种代码,哪一个更好?
其实,两种代码,都有各自的好处,各有各的特点,首先第一个,它释放内存快,方便释放内存,
第二个,方便访问内存的速度,各有各的千秋吧,
我们不去讨论哪一个更好,而是要看,它们各自的优点。你们认为呢?