最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android NDK開發(fā)(C語言--動態(tài)內(nèi)存分配)

 更新時間:2021年12月09日 09:47:40   作者:冬日毛毛雨  
這篇文章主要介紹了Android NDK開發(fā) C語言--動態(tài)內(nèi)存分配

1.C 內(nèi)存管理函數(shù)

C 語言為內(nèi)存的分配和管理提供了幾個函數(shù)。這些函數(shù)可以在 <stdlib.h> 頭文件中找到。

序號 函數(shù)和描述
1 void calloc(int num, int size); 在內(nèi)存中動態(tài)地分配 num 個長度為 size 的連續(xù)空間,并將每一個字節(jié)都初始化為 0。所以它的結(jié)果是分配了 numsize 個字節(jié)長度的內(nèi)存空間,并且每個字節(jié)的值都是0。
2 void free(void *address); 該函數(shù)釋放 address 所指向的內(nèi)存塊,釋放的是動態(tài)分配的內(nèi)存空間。
3 void *malloc(int num); 在堆區(qū)分配一塊指定大小的內(nèi)存空間,用來存放數(shù)據(jù)。這塊內(nèi)存空間在函數(shù)執(zhí)行完成后不會被初始化,它們的值是未知的。
4 void *realloc(void *address, int newsize); 該函數(shù)重新分配內(nèi)存,把內(nèi)存擴展到 newsize。

2.C語音里面的內(nèi)存劃分

  • 棧區(qū)(棧內(nèi)存,存放局部變量,自動分配和釋放,里面函數(shù)的參數(shù),方法里面的臨時變量)
  • 堆區(qū)(動態(tài)內(nèi)存分配,C語音里面由程序員手動分配),最大值為操作系統(tǒng)的80%
  • 全局區(qū)或靜態(tài)區(qū)
  • 常量區(qū)(字符串)
  • 程序代碼區(qū)

3.靜態(tài)與動態(tài)內(nèi)存分配

在程序運行過程中,動態(tài)指定需要使用的內(nèi)存大小,手動釋放,釋放之后這些內(nèi)存還可以被重新使用。

靜態(tài)內(nèi)存分配,分配內(nèi)存大小的是固定,產(chǎn)生的問題:

  • 1.很容易超出棧內(nèi)存的最大值
  • 2.為了防止內(nèi)存不夠用會開辟更多的內(nèi)存,容易浪費內(nèi)存。

動態(tài)內(nèi)存分配,在程序運行過程中,動態(tài)指定需要使用的內(nèi)存大小,手動釋放,釋放之后這些內(nèi)存還可以被重新使用

4.棧溢出

下面的代碼會導(dǎo)致棧溢出:

void main(){
    //屬于靜態(tài)內(nèi)存分配,分配到棧里面,Window里面每一個應(yīng)用棧大概是2M,大小確定。與操作系統(tǒng)有關(guān)。
    int a [1024 * 1024 * 10 * 4];
}


該靜態(tài)內(nèi)存定義為40M,而Window里面每一個應(yīng)用棧大概是2M,超出了范圍, 會報stack overflow錯誤 。

5.動態(tài)內(nèi)存分配與釋放

//堆存分配,40M
//參數(shù):字節(jié) KB M 10M 40M
//開辟
int* p1 = (int*)malloc(1024*1024*10*sizeof(int));
//釋放
free(p1);


通過動態(tài)內(nèi)存分配來動態(tài)指定數(shù)組的大小:

在程序運行過長中,可以隨意的開辟指定大小的內(nèi)存,以供使用,相當(dāng)于Java中的集合

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//創(chuàng)建一個數(shù)組,動態(tài)指定數(shù)組的大小
void main() {
    //靜態(tài)內(nèi)存分配創(chuàng)建數(shù)組,數(shù)組的大小是固定的
    //int i = 10;
    //int a[i];

    int len;

    printf("輸入數(shù)組的長度:");
    scanf("%d", &len);

    //開辟內(nèi)存,大小內(nèi)存len * 4 字節(jié)
    int* p = (int*)malloc(len * sizeof(int));//p:數(shù)組的首地址

    int i = 0;
    for (; i < len; i++) {
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }

    //手動釋放內(nèi)存
    free(p);

    getchar();

}

結(jié)果輸出:

41,0x513f48
67,0x513f4c
34,0x513f50
0,0x513f54
69,0x513f58
24,0x513f5c

6.重新分配realloc

重新分配內(nèi)存的兩種情況:

縮小內(nèi)存,縮小的那一部分?jǐn)?shù)據(jù)會丟失
擴大內(nèi)存,(連續(xù)的)

1.如果當(dāng)前內(nèi)存段后面有需要的內(nèi)存空間,直接擴展這段內(nèi)存空間,realloc返回原指針
2.如果當(dāng)前內(nèi)存段后面的空閑字節(jié)不夠,那么就使用堆中的第一個能夠滿足這一要求的內(nèi)存塊,將目前的數(shù)據(jù)復(fù)制到新的位置,并將原來的數(shù)據(jù)庫釋放掉,返回新的內(nèi)存地址
3.如果申請失敗,返回NULL,原來的指針仍然有效

void main() {
    int len;
    printf("第一次輸入數(shù)組的長度:");
    scanf("%d", &len);

    //開辟內(nèi)存,大小內(nèi)存len * 4 字節(jié)
    int* p = (int*)malloc(len * sizeof(int));//p:數(shù)組的首地址

    int i = 0;
    for (; i < len; i++) {
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }


    int addLen;
    printf("輸入數(shù)組增加的長度:");
    scanf("%d", &addLen);


    int* p2 = (int*)realloc(p, sizeof(int) * (len + addLen));
    if (p2 == NULL) {
        printf("重新分配失敗......");
    }

    printf("------------新數(shù)組-------------------\n");
    //重新賦值
    i = 0;
    for (; i < len + addLen; i++) {
        p2[i] = rand() % 200;
        printf("%d,%#x\n", p2[i], &p2[i]);
    }

    //手動釋放內(nèi)存 p2釋放內(nèi)存 p也會釋放,因為給p2分配內(nèi)存的時候要么p已經(jīng)釋放,要么p2、p指向統(tǒng)一地址區(qū)域
    if (p2 != NULL) {
        free(p2);
        p2 = NULL;
    }
    getchar();

}

結(jié)果輸出:

第一次輸入數(shù)組的長度:5
41,0x5e4ad8
67,0x5e4adc
34,0x5e4ae0
0,0x5e4ae4
69,0x5e4ae8
輸入數(shù)組增加的長度:5
------------新數(shù)組-------------------
124,0x5e4ad8
78,0x5e4adc
158,0x5e4ae0
162,0x5e4ae4
64,0x5e4ae8
105,0x5e4aec
145,0x5e4af0
81,0x5e4af4
27,0x5e4af8
161,0x5e4afc

內(nèi)存分配的幾個注意細(xì)節(jié):

  • 1.不能多次釋放
  • 2.釋放完之后(指針仍然有值),給指針置NULL,標(biāo)志釋放完成
  • 3.內(nèi)存泄露(p重新賦值之后,再free,并沒有真正釋放內(nèi)存)

避免內(nèi)存泄漏:

p重新賦值之前先free

內(nèi)存泄漏寫法:

void main(){
    //40M
    int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));
    //free(p1);
    //p1 = NULL;
    //錯誤,沒有立即釋放內(nèi)存
    printf("%#x\n",p1);

    //80M
    p1 = malloc(1024 * 1024 * 10 * sizeof(int) * 2);
    
    free(p1);
    p1 = NULL;

    getchar();
}

打開任務(wù)管理器,看到有40M內(nèi)存泄漏。

正確寫法:

void main(){
    //40M
    int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));
    free(p1);
    p1 = NULL;
    printf("%#x\n",p1);

    //80M
    p1 = malloc(1024 * 1024 * 10 * sizeof(int) * 2);
    
    free(p1);
    p1 = NULL;

    getchar();
}

打開任務(wù)管理器,看到內(nèi)存只有0.3M,正常。

到此這篇關(guān)于Android NDK開發(fā)(C語言--動態(tài)內(nèi)存分配)的文章就介紹到這了,更多相關(guān)Android NDK C語言動態(tài)內(nèi)存分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android開發(fā)gradle拉取依賴的加速配置

    Android開發(fā)gradle拉取依賴的加速配置

    這篇文章主要為大家介紹了Android開發(fā)gradle拉取依賴的加速配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Android 10 啟動分析之init語法詳解

    Android 10 啟動分析之init語法詳解

    這篇文章主要為大家介紹了Android 10 啟動分析之init語法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android控件FlowLikeView實現(xiàn)點贊動畫

    Android控件FlowLikeView實現(xiàn)點贊動畫

    這篇文章主要為大家詳細(xì)介紹了一個點贊動畫的優(yōu)雅控件FlowLikeView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android調(diào)用應(yīng)用安裝界面方法

    Android調(diào)用應(yīng)用安裝界面方法

    大家好,本篇文章主要講的是Android調(diào)用應(yīng)用安裝界面方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 解決Android解析圖片的OOM問題的方法!!!

    解決Android解析圖片的OOM問題的方法!!!

    我們在編寫Android程序的時候經(jīng)常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,程序占用了過高的內(nèi)存就容易出現(xiàn)OOM(OutOfMemory)異常。本篇文章主要講訴了解決Android解析圖片的OOM問題,有興趣的可以了解一下。
    2016-11-11
  • Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)詳解

    Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)詳解

    這篇文章主要為大家介紹了Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)里的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android編程實現(xiàn)AIDL(跨進(jìn)程通信)的方法詳解

    Android編程實現(xiàn)AIDL(跨進(jìn)程通信)的方法詳解

    這篇文章主要介紹了Android編程實現(xiàn)AIDL(跨進(jìn)程通信)的方法,結(jié)合實例形式詳細(xì)分析了Android實現(xiàn)AIDL(跨進(jìn)程通信)的原理、具體流程與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • Android開發(fā)之文件操作模式深入理解

    Android開發(fā)之文件操作模式深入理解

    本文將介紹Android開發(fā)之文件操作模式,需要了解的朋友可以參考下
    2012-12-12
  • Android強制設(shè)定橫屏?xí)r,SurfaceView一直黑屏

    Android強制設(shè)定橫屏?xí)r,SurfaceView一直黑屏

    本文主要介紹了Android強制設(shè)定橫屏?xí)r,SurfaceView一直黑屏的方法。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • Android PopupWindow增加半透明蒙層

    Android PopupWindow增加半透明蒙層

    這篇文章主要為大家詳細(xì)介紹了Android PopupWindow增加半透明蒙層,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10

最新評論

米易县| 潮州市| 丰城市| 澜沧| 泗水县| 仁化县| 平江县| 东明县| 兰坪| 沂南县| 扶风县| 沂源县| 登封市| 玛纳斯县| 于田县| 雷波县| 汾阳市| 加查县| 荆门市| 南溪县| 天津市| 讷河市| 寿光市| 南溪县| 峨眉山市| 定州市| 绩溪县| 广汉市| 阳春市| 济南市| 安吉县| 浠水县| 阳西县| 婺源县| 常山县| 张家川| 都兰县| 壶关县| 凌源市| 张家口市| 康乐县|