阿里巴巴网站做销售方案,微网站管理,上海网站制作的,莆田系医院的网站用什么做的1.柔性数组
1.1柔性数组的定义
柔性数组是指在结构体中定义的#xff0c;其大小在编译时未确定#xff0c;而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下#xff1a;
struct D
{int a;int arry1[0];
};struct F
{int a;int arry2[];
};…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.hstruct 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.hstruct 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和free struct 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.通常包括全局变量、静态变量以及字符串常量尽管字符串常量本身可能存储在只读区域但其引用或指针可能存储在数据段中
4代码段用于存储程序的机器指令