Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。
一:什么是静态内存什么又是动态内存呢?
- 静态内存:是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间所以变量的分配与释放,都无须程序员自行考虑。
- 动态内存:指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。
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语言的静态内存分配、动态内存分配、动态创建数组的更多相关文章
- Android jni 编程4(对基本类型二维整型数组的操作)
Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android jni 编程(参数的传递,成员,方法的)相互访问
package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...
- Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址 内存地址就是指针. ...
- Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...
- Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 在学习C语言数据类型之前,我们先来回顾一下Java中的基本数据类型和其特点 ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
- Android jni 编程入门
本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...
随机推荐
- C#解决关闭多线程的form主窗体时抛出ObjectDisposedException 异常
一.现象: 我在主窗体新建线程,使用子线程来处理接收到的数据,并且更新窗体显示内容,但关闭主窗体程序之后就程序就报错,如下所示: 二.分析问题: 由于新建线程的处理函数里边是一直死循环处理数据,虽然窗 ...
- 【例题 8-4 UVA - 11134】Fabled Rooks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然把问题分解成两个子问题. x轴和y轴分别做. 即n个点要求第i个点在[li,ri]范围内.(ri<=n) 问是否可行. 按 ...
- WCF 字节数据传输
准备工作 1.新建一个工程,添加一个WCF服务库, 然后公共的类库, 添加一个默认可序列化的的CompositeType类用于压缩. [Serializable] public class Compo ...
- hdu 2795 Billboard(线段树单点更新)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- .net core 分布式性能计数器的实现
1.特别鸣谢张善友老师的指点; 2.分布式性能计数器链接地址:https://mp.weixin.qq.com/s/hPV_bNZD4XmjP0QTE54pWA
- Flume Channels官网剖析(博主推荐)
不多说,直接上干货! Flume Sources官网剖析(博主推荐) 一切来源于flume官网 http://flume.apache.org/FlumeUserGuide.html Flume Ch ...
- 用jquery获取单选按钮选中的内容 和 获取select下拉列表选中的值
1.<label><input name='reason' type='radio' value='您的评论内容涉嫌谣言' />您的评论内容涉嫌谣言</label> ...
- 1.Python字符编码
1.编码简介 编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 ks_c_5601-1987 韩国编 ...
- PAL相机
输入时钟:27M PCLK:54M SDRAM时钟:80M ADV7393时钟:27M 1024*768 60帧 65MHZ
- 回家过年,CSDN博客暂时歇业
CSDN博客之星2013评选活动,结束了,感谢大家的投票. 我个人只是主动拉了300票左右,2400+的票都是大家主动投的,非常感谢啊! (*^__^*) 年关将至,最近也在忙自己的事情,不再更新了. ...