您的位置 首页 > 腾讯云社区

NDK启航篇——C语言基础(内存分配)---longzeqiu

指针、指针类型、空指针、指针运算、函数指针都介绍过了,下面来写一下内存分配 C中的内存主要分为栈区(stack) 栈区的内存是固定的常数,如果超出了就会报Stack OverFlow错误,系统自动分配、释放。堆区(heap) 堆区能够分配操作系统80%的内存,由程序员手动分配及释放。全局区或静态区字符常量区程序代码区 这些都是我们自己做的逻辑分区,物理层面上是不存在分区的。 //栈内存 void stackFun(){ //栈内存自动释放内存 int i[1024]; } //堆内存 单位是字节1024字节为1kb,1024kb是1M void heapFun(){ //分配4M内存 malloc的返回值为void* 所以返回值类型为任意类型指针。 int *a = malloc(1024 * 1024 * sizeof(int)); //释放内存 free(a) }内存分配分为静态内存分配和动态内存分配 静态内存分配 编译期就确定开辟内存的大小容易超出栈内存的最大值容易浪费内存(为了防止内存不够而开辟更多的内存)动态内存分配 程序运行过程中,动态开辟内存的大小,手动释放,释放后的内存可重新使用//尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出 #include<stdio.h> //lib表示类库 引入标准类库 #include<stdlib.h> void main(){ //静态内存分配创建数组,数组的大小是固定的 int z = 20; int a[z]; int len; printf("请输入数组的长度:"); //创建一个数组,动态指定数组的大小(在程序运行规程中,可以随意的开辟指定大小的内存,以供使用,相当于JAVA中的集合) scanf("%d",&len); //动态开辟内存大小为len*4,p是数组的首地址也是数组的名称 int * p = malloc(len * sizeof(int)); //用刚开辟的内存区域给数组元素赋值 int i = 0; for(; i < len; i++){ p[i] = rand() % 100; printf("%d,%#xn",p[i],&p[i]); } //手动释放内存 free(p); getchar(); }使用场景(动态内存分配) 内存不够,重新分配 realloc: realloc(原来内存的指针,内存扩大之后的总大小); 缩小的话会丢失缩小部分内存中的数据扩大如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针扩大如果当前内存段后面的内存空间不够,那么使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据释放掉,返回新的内存地址扩大如果申请失败,返回NULL,原来的指针仍然有效//尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出 #include<stdio.h> //lib表示类库 引入标准类库 #include<stdlib.h> void main(){ //静态内存分配创建数组,数组的大小是固定的 int z = 20; int a[z]; int len; printf("请输入数组的长度:"); //创建一个数组,动态指定数组的大小(在程序运行规程中,可以随意的开辟指定大小的内存,以供使用,相当于JAVA中的集合) scanf("%d",&len); //动态开辟内存大小为len*4,p是数组的首地址也是数组的名称 int * p = malloc(len * sizeof(int)); //用刚开辟的内存区域给数组元素赋值 int i = 0; for(; i < len; i++){ p[i] = rand() % 100; printf("%d,%#xn",p[i],&p[i]); } int addLen; printf("输入数组增加的长度:"); scanf("%d",&addLen); //扩大刚分配的空间 //realloc(原来内存的指针,内存扩大之后的总大小) int * p2 = realloc(p,sizeof(int)*(len+addLen)); if(p2 == NULL){ printf("空间不足,申请失败"); } //重新赋值 i = 0; for(;i < len + addLen; i++){ p2[i] = rand() % 100; } //手动释放内存 if(p! = NULL){ free(p2); p = NULL; } if(p2 != NULL){ free(p2); p2 = NULL; } getchar(); }内存分配注意事项不能多次释放释放完之后,给指针置NULL,标志释放完成内存泄漏(重新赋值之前没有先释放)好了,内存分配到这里就结束了,明天写C字符串,欲速则不达,慢慢来不着急。 ---来自腾讯云社区的---longzeqiu

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: