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 程 ...
随机推荐
- HDU 多校联合 6045
Is Derek lying? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- USACO 2009 Dec cow toll paths 过路费-floyd
这道题首先要明确一点,那就是当你从一个点走到自己时,也是需要花费这个点点权值的费用.这个点卡了我两次QWQ 然后我比较喜欢分两步搞: 首先,我们利用floyd的一个性质:就是在更新其他点之间的路线时要 ...
- 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)
package com.flong.codegenerator; import java.sql.Connection; import java.sql.DatabaseMetaData; impor ...
- [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试
原贴:http://imysql.cn/node/313 [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试 周二, 2007/06/19 - 22:10 - yejr ...
- [NPM] Test npm packages locally in another project using npm link
We will import our newly published package into a new project locally to make sure everything is wor ...
- StartCoroutine的使用
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的.这个时候能够使用协程来完毕. 使 ...
- es6常用功能与异步详解(JS高级面试题)
callback hell方法的使用 可读性不友好 function loadImg(src,callback,fail){ var img = document.createElement('img ...
- Codeforces_GYM_100741 A
http://codeforces.com/gym/100741/problem/A A. Queries time limit per test 0.25 seconds memory limit ...
- [Angular2 Router] Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?
In this tutorial we are going to learn how we can can configure redirects in the angular 2 router co ...
- amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse
amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...