毕节网站建设,网站设计专业有前途吗,系统的php网站建设,wordpress如何添加子主题动态分配内存概述
先说数组的长度是预定义好的#xff0c;固定不变的。但是呢#xff0c;实际上所需的内存空间取决于实际输入的数据#xff0c;而无法预先确定。所以根据实际情况#xff0c;推出了内存管理函数。这些内存管理函数可以按需要动态分配内存空间#xff0c;…动态分配内存概述
先说数组的长度是预定义好的固定不变的。但是呢实际上所需的内存空间取决于实际输入的数据而无法预先确定。所以根据实际情况推出了内存管理函数。这些内存管理函数可以按需要动态分配内存空间也可以吧不在使用的空间回收再次利用
静态分配
在程序编译或运行过程中按事先规定大小分配内存空间的分配方式。必须事先知道所需空间大小分配在栈区或全局变量区一般以数组的形式。按计划分配
动态分配
在程序运行过程中根据需要大小自由分配所需空间按需分配分配在堆区一般使用特点的函数进行分配。
动态分配函数
stdlib.h
malloc函数
函数原型void*malloc(unsigned int size)功能说明在内存的动态存储区堆区中分配一块长度为size字节的连续区域用来存放类型说明符指定的类型。函数原型返回void*指针使用时必须做相应的强制类型转换分配的内存空间内容不确定一般使用memset初始化。返回值分配空间的起始地址分配成功NULL分配失败在调用malloc之后一定要判断一下是否申请内存成功如果多次malloc申请的内存第一次和第二次申请的内存不一定是连续的
练习
#includestdlib.h
#includestdio.h
#includestring.h
int main() {int* p;int i, n;printf(输入申请的元素个数\n);scanf_s(%d, n, 4);p (int*)malloc(n * 4);if (p NULL) {printf(error\n);return 0;}for (i 0;i n;i) {p[i] i;}for (i 0;i n;i) {printf(p[%d]%d\n, i, p[i]);}free(p);return 0;
}
free函数
头文件#includestdlib.h函数定义void free(void*ptr)函数说明free函数释放ptr指向的内存注意ptr指向的内存必须是malloc calloc relloc动态申请的内存free后因为没有给p赋值所以p还是指向原先动态申请的内存。但是内存已经不能再用了p变成野指针了。一块动态申请的内存只能free一次不能多次free
calloc函数
头文件#includestdlib.h函数定义void*calloc(size_t nmemb,size_t size);size_t实际是无符号整型它是在头文件中用typedef定义出来的。函数的功能在定义的堆中申请nmemb快每块的大小为size个字节的连续区域malloc和calloc函数都是用来申请内存的。区别malloc申请的内存内存中存放的内容是随机的不确定的而calloc函数申请的内存中的内容为0调用方法char*p(char*)calloc(3,100);(在堆中申请了三块每块大小为100字节及300个字节连续的区域)
realloc函数重新申请内存
为了使申请的两块内存连续而出现realloc函数。使用malloc,calloc函数单次申请的内存是连续的两次申请的两块内存不一定连续头文件#includestdlib.h函数定义void*realloc(void*s,unsigned int newsize)函数的功能在原先s指向的内存基础上重新申请内存新的内存的大小为new_size个字节如果原先内存后面有足够大的空间就追加如果后边的内存不够用则relloc函数会在堆区找一个newsize个字节大小的内存申请将原先内存中的内容拷贝过来然后释放原先的内存最后返回一个新内存地址如果newsize比原先的内存小则会释放原先内存的后面的存储空间只留前面的newsize个字节。返回值新申请的内存的首地址
内容泄露
也就是申请的内存首地址丢了找不到了。