|
1 C 語言里面的內(nèi)存劃分
2 靜態(tài)與動(dòng)態(tài)內(nèi)存分配
3 棧溢出 } 4 動(dòng)態(tài)內(nèi)存分配與釋放 //參數(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ù)組的大小 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 //縮小,縮小的那一部分?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é)問題
安全釋放的例子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ǔ)--指針 讀者須知 |
|
|