专栏首页Android小知识NDK启航篇——C语言基础(内存分配)

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

指针、指针类型、空指针、指针运算、函数指针都介绍过了,下面来写一下内存分配

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,%#x\n",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,%#x\n",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字符串,欲速则不达,慢慢来不着急。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NDK启航篇——C语言基础

    longzeqiu
  • NDK启航篇——C语言基础(指针)

    如上代码运行你会发现取出来的值为0.00000,原因就是指针的类型不匹配(通过4字节读取8字节的内容)

    longzeqiu
  • NDK启航篇——C语言基础(字符串)

    longzeqiu
  • NDK启航篇——C语言基础(结构体)

    longzeqiu
  • NDK启航篇——C语言基础(联合体)

    longzeqiu
  • NDK启航篇——C语言基础(函数指针)

    这里是彩蛋哦,肯定有人会问这就结束了,指针函数呢? ?,指针函数和函数指针并没有什么关系,非常简单,就是函数的返回值是指针而已,前面已经讲过指针是什么了所以就不...

    longzeqiu
  • NDK启航篇——C语言基础(结构体补充)

    longzeqiu
  • NDK启航篇——C语言终章(文件IO操作)

    longzeqiu
  • C语言内存地址基础

    从计算机内存的角度思考C语言中的一切东东,是挺有帮助的。我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节。比方说我们的电脑有 4K 内存,...

    猿人谷
  • C语言 | 动态内存分配

    在C语言中,全局变量是分配在内存中的静态存储区的,非静态的局部变量,包括形参是分配在内存中的动态存储区的,这个存储区是一个“栈”的区域。

    小林C语言
  • Android Studio 4.0 稳定版发布了

    Android Studio 4.0(2020年5月) 更新啦,此版本包含了各种新功能和改进,还有一些废弃配置。

    GSYTech
  • 【C语言基础】内存的初始化

    我们编写C语言的时候需要给变量申请一块内存区域,当我们创建一个内存区域的时候,内存中的数据十有八九是乱七八糟的(因为其他代码用过后遗留的数据并没有及时清掉) i...

    程序员互动联盟
  • Android面试指南:在市场初级开发饱和环境下,如何登上BAT这座山成为巅峰者年薪50W+?

    在我刚加入现在这个团队时,那会儿才毕业大半年,我就在思考这个问题,只不过当时更专注于Android开发领域:Android开发的核心竞争力是什么?我有一个专门的...

    Android技术干货分享
  • android studio2.3如何编译动态库的过程详解

    最近在工作中需要编译android下的动态库,本以为是一件简单的事,没想到因为工具,以及google本身被墙的原因,折腾了好久。

    砸漏
  • c语言基础学习08_内存管理

    ============================================================================= 涉及...

    黑泽君
  • Android监听自身卸载,弹出用户反馈调查

    1,情景分析         在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用...

    xiangzhihong
  • Linux下快速构建Android编译环境

    通常,开发苹果系列的软件均需要使用一些专有开发工具,比如xcode,而此工具必须运行在Mac OS X设备上(当然你也可以尝试各种黑苹果的方式),所以不论是对于...

    BGBiao
  • android Ndk JNI 入门

    相信很多人对于NDK 开发都是懵逼的,比如都知道把加密的逻辑以及密钥放在so文件中,但是你知道怎么生成so文件吗?你知道开发jni吗?你熟悉jni语法吗?怎么配...

    Anymarvel
  • Unity与 SO 交互 ☀️| 详细讲解 怎样通过 Android Studio 生成一个.so文件 并简单调用!

    本文章是Unity与 SO 交互的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————????订阅专栏???? 就可以免费观看多篇相关内容...

    呆呆敲代码的小Y

扫码关注云+社区

领取腾讯云代金券