互联网电商网站建设,旅行网站开发需求说明书,杭州互联网企业排名,重庆市建设工程造价管理协会官网这里写目录标题 动态内存分配的原因动态内存函数mallocfreecallocrealloc C/C内存开辟柔性数组柔性数组特点 动态内存分配的原因
常见的内存开辟方式#xff1a;
int a 10;//在栈空间上开辟4个字节
char arr[10] {0};//在栈空间上开辟连续的10个字节上述开辟的空间问题内存开辟柔性数组柔性数组特点 动态内存分配的原因
常见的内存开辟方式
int a 10;//在栈空间上开辟4个字节
char arr[10] {0};//在栈空间上开辟连续的10个字节上述开辟的空间问题 1.空间开辟大小是固定的。 2. 数组在申明的时候必须指定数组的长度它所需要的内存在编译时分配
但有时需要程序运行时才知道空间大小所以需要动态内存开辟
动态内存函数
malloc void* malloc (size_t size); 该函数向内存申请一块连续可用的空间并返回指向这块空间的指针
如果开辟成功则返回一个指向开辟好空间的指针如果开辟失败则返回一个NULL指针因此malloc的返回值一定要做检查返回值的类型是 void*所以malloc函数并不知道开辟空间的类型具体在使用的时使用者自己来决定如果参数 size 为0malloc的行为是标准是未定义的取决于编译器
free void free (void* ptr); free函数用来释放动态开辟的内存
如果参数 ptr 指向的空间不是动态开辟的那free函数的行为是未定义的如果参数 ptr是NULL指针则函数什么事都不做
calloc void* calloc (size_t num, size_t size); 函数的功能是为 num 个大小为 size 的元素开辟一块空间并且把空间的每个字节初始化为0与函数 malloc的区别只在于 calloc会在返回地址之前把申请的空间的每个字节初始化为全0
realloc void* realloc (void* ptr, size_t size); realloc函数就可以做到对动态开辟内存大小的调整size的大小是总的大小比如已经用malloc开辟了40个字节的空间size60就是开辟4020个字节的空间
ptr是要调整的内存地址size 调整之后新大小返回值为调整之后的内存起始位置函数调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间realloc在调整内存空间的是存在两种情况 情况1原有空间之后有足够大的空间情况2原有空间之后没有足够大的空间 情况1 当是情况1 的时候要扩展内存就直接原有内存之后直接追加空间原来空间的数据不发生变化 情况2 当是情况2 的时候原有空间之后没有足够多的空间时扩展的方法是在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址
C/C内存开辟 C/C程序内存分配的几个区域
1.栈区(stack):在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等2.堆区(heap):一般由程序员分配释放若程序员不释放程序结束时可能由OS回收分配方式类似于链表3.数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放4.代码段:存放函数体(类成员函数和全局函数)的二进制代码。
柔性数组
柔性数组flexible arrayC99 中结构中的最后一个元素允许是未知大小的数组这就叫做『柔性数组』成员
typedef struct st_type
{
int i;
int a[0];//柔性数组成员
}type_a;柔性数组特点
结构中的柔性数组成员前面必须至少一个其他成员sizeof 返回的这种结构大小不包括柔性数组的内存包含柔性数组成员的结构用malloc(0函数进行内存的动态分配并且分配的内存应该大于结构的大小以适应柔性数组的预期大小
柔性数组好处
方便内存释放有利于访问提升速度
#include stdio.h
#include stdlib.hstruct S
{int n;int arr[0];//柔性数组
};int main()
{printf(%d\n, sizeof(struct S));//4struct S* s (struct S*)malloc(sizeof(struct S) 40);//440if (s NULL){perror(s);return 1;}s-n 100;int i 0;for (i 0; i 10; i){s-arr[i] i;}//扩容struct S* ptr (struct S*)realloc(s, sizeof(struct S) 40 20);if (ptr NULL){perror(ptr);return 1;}s ptr;s-n 15;printf(%d\n, s-n);for (i 0; i 15; i){printf(%d , s-arr[i]);}//释放free(s);s NULL;return 0;
}