小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android NDK 開發(fā)之旅 3 -- C 語言基礎(chǔ)--內(nèi)存分配

 codingSmart 2021-10-22


1

 C 語言里面的內(nèi)存劃分

  1. 棧區(qū)(棧內(nèi)存,存放局部變量,自動(dòng)分配和釋放,里面函數(shù)的參數(shù),方法里面的臨時(shí)變量)

  2. 堆區(qū)(動(dòng)態(tài)內(nèi)存分配,C 語言里面由程序員手動(dòng)分配),最大值為操作系統(tǒng)的 80%

  3. 全局區(qū)(靜態(tài)區(qū))

  4. 常量區(qū)(字符串)

  5. 程序代碼區(qū)

2

 靜態(tài)與動(dòng)態(tài)內(nèi)存分配

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

  2. 靜態(tài)內(nèi)存分配,分配內(nèi)存大小的是固定,問題:1.很容易超出棧內(nèi)存的最大值 2.為了防止內(nèi)存不夠用會(huì)開辟更多的內(nèi)存,容易浪費(fèi)內(nèi)存。

3

棧溢出

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

4

動(dòng)態(tài)內(nèi)存分配與釋放

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

//釋放
free(p1);

5

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

int len;
len = scanf("%d" , &len);
int* arr = (int*)malloc(len * sizeof(int));

//另外一種方法
//(int*)calloc(len , sizeof(int));
//p是數(shù)組的首地址,p就是數(shù)組的名稱

//給數(shù)組元素賦值(使用這一塊剛剛開辟出來的內(nèi)存區(qū)域)

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

6

 重新分配 realloc
//重新分配內(nèi)存的兩種情況:
//縮小,縮小的那一部分?jǐn)?shù)據(jù)會(huì)丟失
//擴(kuò)大,(連續(xù)的)
//1.如果當(dāng)前內(nèi)存段后面有需要的內(nèi)存空間,直接擴(kuò)展這段內(nèi)存空間,realloc返回原指針
//2.如果當(dāng)前內(nèi)存段后面的空閑字節(jié)不夠,那么就使用堆中的第一個(gè)能夠滿足這一要求的內(nèi)存塊,將目前的數(shù)據(jù)復(fù)制到新的位置,并將原來的數(shù)據(jù)庫釋放掉,返回新的內(nèi)存地址
//3.如果申請失敗,返回NULL,原來的指針仍然有效
int addLen =10;

//用realloc來擴(kuò)大內(nèi)存
//1.原來內(nèi)存的指針 2.內(nèi)存擴(kuò)大之后的總大小
int* p2 = (int*)realloc(arr,(len +addLen) * sizeof(int) );

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

7

釋放內(nèi)存的細(xì)節(jié)問題

  1. 不能多次釋放(否則會(huì)產(chǎn)生中斷)

  2. 釋放完之后(指針仍然有值),給指針置 NULL,標(biāo)志釋放完成

  3. 內(nèi)存泄露(p 重新賦值之后,再 free,并沒有真正釋放內(nèi)存(之前的內(nèi)存))

安全釋放的例子

if (p2 != NULL){ free(p2); p2 = NULL;
}

內(nèi)存泄漏的例子

void main(){ //分配40M int* p = (int*)malloc(1024*1024*40); //下一次分配之前,如果不釋放,會(huì)造成40M的內(nèi)存泄漏 free(p); p = NULL; //分配80M p = (int*)malloc(1024*1024*80); free(p); system("pause");
}

8

本系列

Android NDK 開發(fā)之旅 1--C 語言基礎(chǔ)--基本數(shù)據(jù)類型

Android NDK 開發(fā)之旅 2--C 語言基礎(chǔ)--指針

讀者須知

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多