版权声明:本文出自阿钟的博客,转载请注明出处: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 程 ...
随机推荐
-
[转]CSS hack大全&;详解
转自:CSS hack大全&详解 1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的, ...
-
视频直播APP开发分析
视频直播APP开发到目前为止都还是热门的一个行业,而且发展到现在直播的种类非常多,很多行业都打入了直播行业,再也不是单纯的人物直播这么单一了.视频直播APP开发行业就像是吃螃蟹,来的早的人不懂如何吃, ...
-
Struts2 Struts.xml DTD 说明
转自:http://blog.csdn.net/cuixiuqin1954/article/details/4228741 关于Struts2中的核心配置文件struts.xml,就其DTD(Docu ...
-
DBA_Oracle Sort排序处理空间耗用(概念)
2014-12-18 Created By BaoXinjian
-
Javascript数据类型之Undefined和null
Javascrip中的数据类型分为原始数据类型(primitive type)和对象数据类型(object type). 原始数据类型 原始数据类型包括:数字.字符串.布尔值.null.undefin ...
-
Bash判断文件夹(目录)是否存在
#!/bin/bash if [ -d DirName ]; then echo 'Dir exist' else echo 'Dir not exist' fi
-
iOS-UICollectionView自定义布局
UICollectionView自定义布局 转载: http://answerhuang.duapp.com/index.php/2013/11/20/custom_collection_view_l ...
-
visual studio code运行时报错,无法将“cnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称,Cannot find module &#39;webpack&#39;
前言 因公司技术需求,这段时间成功进入了Vue 2.0 的坑,刚用起Visual Studio Code,却发现问题很多,发现一个错误:cnpm : 无法将“cnpm”项识别为 cmdlet.函数.脚 ...
-
Coconuts HDU - 5925 (二维离散化求连通块的个数以及大小)
题目链接: D - Coconuts HDU - 5925 题目大意:首先是T组测试样例,然后给你n*m的矩阵,原先矩阵里面都是白色的点,然后再输入k个黑色的点.这k个黑色的点可能会使得原先白色的点 ...
-
域名重新绑定ip时访问地址NotFount404
情形描述:部署在A服务器IIS上的asp.net程序,搬迁到B服务器上,重新绑定域名和ip后.再访问网址时有些电脑能正常访问,而有些电脑报404 not found错误. 经分析发现是个人电脑网络设置 ...