版权声明:本文出自阿钟的博客,转载请注明出处: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所占的内存就是动态内存。

Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组的更多相关文章

  1. Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...

  2. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

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

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

  5. Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...

  6. Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 在学习C语言数据类型之前,我们先来回顾一下Java中的基本数据类型和其特点 ...

  7. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  8. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  9. Android jni 编程入门

    本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...

随机推荐

  1. 16.REPL 命令

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html ctrl + c - 退出当前终端. ctrl + c 按下两次 - 退出 Node REPL ...

  2. golang pipe

    ===============golang pipe============== package main import ( "fmt" "io" ) func ...

  3. js上传文件(图片)的格式和大小限制

    如果你想快速解决这个问题,看本文就够了.查了好多资料,终于解决了,太耗时间了,本文留给给后来者,希望你们工作的更轻松 本文保存为.html文件用浏览器打开即可测试功能 <form id=&quo ...

  4. BZOJ3510首都(LCT)

    Description 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从 ...

  5. Jquery获取select选中的option的文本信息

    注意:以下用的$(this)代表当前选中的select框 第一种: $(this).children("option:selec... ...查看全文

  6. 玩转Bootstrap(基础) -- (6.导航条基础)

    1.导航条样例 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...

  7. log4j的总结

    概述 log4j是日志处理的框架,相当于.net中的log4net.因为之前在.net中学习过log4net.所以.在学习log4j上,感觉很的亲切.本篇博客主要是讲一个图,好了进入正题. log4j ...

  8. PowerApps和Flow,Power BI开发

    为PowerApps和Flow,Power BI开发自定义连接器 作者:陈希章 发表于 2017年12月20日 前言 我在之前用了几篇文章来介绍新一代微软商业应用平台三剑客(PowerApps,Mic ...

  9. loadrunner--设置代理录制

    为了解决loadrunner录制不到脚本或录制经常无响应等情况,可以选用代理录制方式,步骤如下. 打开配置好代理的浏览器,输入要录制的服务器ip,开始操作,录制完成后点击Shutdown

  10. 【CS Round #43 B】Rectangle Partition

    [链接]https://csacademy.com/contest/round-43/task/rectangle-partition/ [题意] 水题 [题解] 横着过去,把相邻的边的宽记录下来. ...