Android JNI編程(五)——C語言的靜態內存分配、動態內存分配、動態創建數組


目錄(?)[+]

一:什么是靜態內存什么又是動態內存呢?

  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所占的內存就是動態內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM