目录1.柔性数组1.1柔性数组的定义1.2柔性数组的特点1.3柔性数组的使用1.3.2两种方法的总结2.c/c程序中内存区域的划分1.柔性数组1.1柔性数组的定义柔性数组是指在结构体中定义的其大小在编译时未确定而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下struct D { int a; int arry1[0]; }; struct F { int a; int arry2[]; };柔性数组有上述两种写法具体实现依据编译器vs编译器都支持1.2柔性数组的特点1结构体中在柔性数组成员之前至少还有一个成员2柔性数组属于结构体的最后一个成员3sizeof计算的结构体大小不包括柔性数组的大小4包含柔性数组的结构体使用malloc分配的内存需要大于结构体的大小以适应柔性数组的预期大小1.3柔性数组的使用#include stdio.h #include stdlib.h struct D { int a; int arry1[0]; }; int main() { struct D * p (struct D* )malloc(sizeof(struct D) 10 * sizeof(int)); if (p NULL) { perror(malloc); return 1; } for (int i 0; i 10; i) p-arry1[i] i; struct D * temp (struct D*)realloc(p, sizeof(struct D) 20* sizeof(int)); if (temp ! NULL) p temp; for (int i 0; i 20; i) printf(%d , p-arry1[i]); free(p); p NULL; return 0; }1柔性数组之所以有柔性是因为该数组的大小可以根据需要去改变即使是变长数组程序运行之后大小也会被固定2上述的结构体成员存在于堆区上也可以通过下面的方式进行实现先在堆区创建一个包含指针的结构体再在堆区分配一定大小的内存用结构体的指针指向这块内存#include stdio.h #include stdlib.h struct D { int a; int *arry1; }; int main() { struct D* p (struct D*)malloc(sizeof(struct D)); if (p NULL) { perror(malloc); return 1; } int* temp (int*)malloc(20 * sizeof(int)); if (temp ! NULL) p-arry1 temp; for (int i 0; i 20; i) p-arry1[i] i; for (int i 0; i 20; i) printf(%d , p-arry1[i]); free(p-arry1); p- arry1 NULL: free(p); p NULL; return 0; }1.3.2两种方法的总结1第一种方法是在堆区开辟一块连续的内存使用一次malloc和free即可struct D { int a; int arry[0]; };2第二种方法不一定连续需要使用两次malloc和freestruct D { int a; int *arry; };相比之下方法1具有两个好处1方便内存释放一次free即可2有利于访问速度连续的内存访问速度更快2.c/c程序中内存区域的划分主要针对学习程序语言时的划分图片来源鹏哥c语言1栈区stack主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等特点1.内存分配和释放速度快2.大小有限较大的局部变量或深度递归可能导致栈溢出3.在执⾏函数时函数内局部变量的存储单元都可以在栈上创建函数执⾏结束时这些存储单元⾃动被释放2堆区heap用于动态内存分配特点1.由程序员手动分配和释放使用malloc、new等函数以及free、delete等函数2.如果程序员不释放内存则可能会导致内存泄漏3.堆区的大小受限于计算机系统中有效的虚拟内存相对灵活且较大3数据段静态区用于存储全局变量和静态变量。特点1.数据段在程序编译时已经分配了内存并初始化了初始值2.未初始化的全局变量和静态变量在程序开始执行时会被自动初始化为零对于数值类型变量3.通常包括全局变量、静态变量以及字符串常量尽管字符串常量本身可能存储在只读区域但其引用或指针可能存储在数据段中对比项全局变量无 static静态局部变量函数内 static作用域整个程序跨文件可见仅所在函数内部生命周期程序运行期间一直存在程序运行期间一直存在内存区域静态存储区.data / .bss静态存储区链接属性外部链接无链接初始化仅一次程序启动时仅一次第一次进入函数时生命周期一样长但作用域完全不同对比项普通全局变量静态全局变量定义位置函数外部函数外部作用域定义处开始到文件末尾定义处开始到文件末尾跨文件可见性可见用extern声明不可见仅限本文件生命周期程序运行期间程序运行期间内存位置静态存储区静态存储区全局变量 static 限制作用域只在本文件内防止其他文件 extern 引用4代码段用于存储程序的机器指令