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 程 ...
随机推荐
- SQL创建数据库、表、存储过程及调用
--如果存在数据库PRogrammerPay 就删除 if exists (select * from sysdatabases where name='programmerPay') drop d ...
- Codefroces 812 B. Sagheer, the Hausmeister
http://codeforces.com/problemset/problem/812/B B. Sagheer, the Hausmeister time limit per test 1 sec ...
- ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
在开发中会用到右键菜单,我们来一起学习一下. 假如,我们现在已经准备好了列表,就差右键处理了. 1.在资源视图中的添加一个MENU,如图 2.给要添加右键菜单的ListCtrl子类,添加消息 按 ct ...
- 【AIM Tech Round 4 (Div. 2) A】Diversity
[链接]http://codeforces.com/contest/844/problem/A [题意] 大水题 [题解] 看看不同的个数num是不是小于k,小于k,看看len-num够不够补的 [错 ...
- HDU——T 1576 A/B
http://acm.hdu.edu.cn/showproblem.php?pid=1576 Time Limit: 1000/1000 MS (Java/Others) Memory Limi ...
- 洛谷 P2978 [USACO10JAN]下午茶时间Tea Time
P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...
- opera mini 7.5安卓改服版
opera mini 7.5安卓改服版Opera mini 7.5安卓版前两天发布了,试着进行改服实现***,过程跟以前的OPM7.0差不多,大家可参照我之前的博客教程Opera mini7.0改服教 ...
- WebStorm(Amaze开发工具)--JavaScript 开发工具
WebStorm(Amaze开发工具)--JavaScript 开发工具 一.总结 1.webstorm:前段开发神器,应该比sublime好用. 2.webstorm功能:支持显示图片宽高,标签重构 ...
- Event Serializers官网剖析(博主推荐)
不多说,直接上干货! Flume Sources官网剖析(博主推荐) Flume Channels官网剖析(博主推荐) Flume Channel Selectors官网剖析(博主推荐) Flume ...
- JSP中的EL表达式详细介绍
一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素.它们通常用于对象操作以及执行那些 ...