版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。

目录(?)[+]

一:什么是静态内存什么又是动态内存呢?

  1. 静态内存:是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间所以变量的分配与释放,都无须程序员自行考虑。
  2. 动态内存:指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

1.下面通过一个例子来认识一下静态内存分配

#include<stdio.h>
#include<stdlib.h>
/**静态内存分配*/
//二级指针才能接收一级指针的地址
void function(int** point) {//定义一个int类型的变量,并且赋值100 int i = 100; //把i对应的地址赋值给*point一级变量 *point = &i; } main() { //定义一个int类型的一级指针变量 int* point; function(&point); printf("*point=%d\n",*point); printf("*point=%d\n",*point); system("pause"); }

从打印结果看以看出,第一次打印的时候成功的改变了point的值当我们第二次打印得到的值却是0。原因其实很简单,执行function()函数的改变了point的值。当function()函数执行完毕的时候系统将函数内的变量回收掉了也就不存在了,i的地址就不存在了所以*point指向i的地址也就没有了。

2.动态内存分配(堆分配)

#include<stdio.h>
#include<stdlib.h>
/**动态内存分配*/
void function(int** point) {//malloc(内存大小);向系统申请一块内存,返回一个地址值 int* temp = malloc(sizeof(int)); int i =100; //把i的值赋值给temp指针指向的值 *temp = i; //把point对应的地址值修改为temp的地址值 *point = temp; } main() { //定义一个int类型的一级指针变量 int* point; function(&point); printf("*point=%d\n",*point); printf("*point=%d\n",*point); system("pause"); }

在function()函数中通过malloc(内存大小);函数向系统在堆内存中申请一块空间;返回一个地址值 。当function()函数执行完毕的时候*temp指针变量在堆内存中所以不会被回收,所以*point指向的地址依旧存在。

上面我门手动申请的temp内存,系统不会帮我们回收那么问题来了,当不需要的时候怎么回收这个垃圾呢?

想要回收一个垃圾的时候可以调用free函数即可将内存释放   free(变量);

二:动态创建一个数组,动态扩展数组长度

//malloc(大小)
int* arr = malloc(3);//在堆内存申请一块空间 //realloc(需重新分配内存的变量, 大小); arr = realloc(arr,3);//不改变原有内容的基础上,重新分配空间

1.看个小案例就大概知道这两个函数的意思了

#include<stdio.h>
#include<stdlib.h>
/**动态创建数组*/
main() {printf("请输入数组的长度:\n"); int length; scanf("%d",&length); printf("输入数组的长度为:%d\n",length); //动态申请一块内存,int占4个字节 int* arr = malloc(length * 4); int i; for(i=0; i<length; i++) { printf("输入arr[%d]的值:",i); scanf("%d",arr+i); } //让用户扩展数组的长度 printf("请输入扩展数组的长度:\n"); int superLength; scanf("%d",&superLength); //对数组的内存进行重新分配 realloc(需重新分配内存的变量, 大小); arr = realloc(arr,(length + superLength) * 4); for(i=length; i<length + superLength; i++) { printf("输入arr[%d]的值:",i); scanf("%d",arr+i); } //将数组的内容打印出来 for(i=0; i<length + superLength; i++) { printf("arr[%d]的值=%d\n",i,*(arr + i)); } //使docs窗口停留 system("pause"); }

来看下程序运行效果

三:静态内存相当于Java中一个函数内的变量,执行方法的时候开辟一块空间方法执行完毕的时候由Jvm进行回收;动态内存就相当于我们Test test = new Test();test所占的内存就是动态内存。

转载于:https://www.cnblogs.com/Free-Thinker/p/6169328.html

Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...相关推荐

  1. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  2. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

  3. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  4. Android JNI 编程

    JNI函数名称分为三部分: 首先是Java关键字,供Java虚拟机识别:例如Java_com_example_hellojni_HelloJni_stringFromJNI Java:关键字 com_ ...

  5. Android网络编程五:(1)Volley简介

    转载自:http://blog.csdn.net/t12x3456/article/details/9221611 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西 ...

  6. android 变量定义数组,android 创建数组

    一: private String[] data = new String[]{"Hello", "jike", "world"}; 二: ...

  7. android JNI(转)

    原文:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行 ...

  8. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

  9. Android JNI学习(六)——Java与Native实战演习

    前言: 前几篇我主要介绍了jni先关的基础知识和常用API,相信看过的童靴对JNI已经有了一定的了解,如果不了解也没关系,下面我给出了链接,可以点进去学习.接下来我将实战一个完整案例,案例很简单,就是 ...

最新文章

  1. Linux查找文件 —— whereis 、 find、 locate、 which
  2. Sublime3 搭建C/C++环境
  3. 【快乐水题】1518. 换酒问题
  4. cefpython基础入门
  5. python四大高阶函数_Python里的高阶函数
  6. 【Kafka】kafka 脚本kafka-configs.sh用法解析
  7. HDU-1540 Tunnel Warfare 线段树最大连续区间 或 STL巧解
  8. 你还在用notifyDataSetChanged?
  9. 智能音箱,你在窃听我吗?
  10. 为什么Spark比MapReduce快
  11. Git工具代码版本管理以及基本使用说明
  12. libaio.so.1 is needed by MySQL-server-5.5.48-1.linux2.6.i386
  13. h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案
  14. xdb 服务_oracle禁用XDB服务
  15. 机械臂速成小指南(五):末端执行器
  16. 2021牛客多校#10 F-Train Wreck
  17. 这可能是我用过最好用的SQL工具,免费还免安装,良心推荐SQL Studio
  18. 什么是Window【What Is a Window?】
  19. Learn How Google Works: in Gory Detail
  20. Mac苹果电脑怎样安装Python

热门文章

  1. RxSwift 系列(一)
  2. NOI 练手题 图像旋转翻转变换
  3. g2 折线图点与点之间直线_科学网—ggplot2实现散点折线图 - 肖斌的博文
  4. python 输入字符串_输入输出,字符串如影随形 | Python基础连载(五)
  5. PostgreSQL数据库修改sql表的方法汇总
  6. 怎么用python画饼状图_Python入门进阶:Python绘制饼图到Microsoft Excel
  7. AUTOSAR从入门到精通100讲(四十六)-CANoe工具使用-实现CAN通道的收、发、录、回放报文
  8. 基于 Apache Hudi 构建流批一体系统实践
  9. 原理c++_浅谈C/S和B/S架构的工作原理及优缺点
  10. 话筒好坏测试软件,如何简单地判断麦克风的质量好坏?