1 C 语言里面的内存划分
2 静态与动态内存分配
3 栈溢出 } 4 动态内存分配与释放 //参数:字节 KB M 10M 40M //开辟 int* p1 = (int*)malloc(1024*1024*10*sizeof(int)); //释放 free(p1); 5 通过动态内存分配来动态指定数组的大小 len = scanf("%d" , &len); int* arr = (int*)malloc(len * sizeof(int)); //另外一种方法 //(int*)calloc(len , sizeof(int)); //p是数组的首地址,p就是数组的名称 //给数组元素赋值(使用这一块刚刚开辟出来的内存区域) int i = 0;for (; i < len - 1; i++){ arr[i] = rand() % 100; printf("%d,%#x\n", arr[i], &arr[i]); } free(arr); 6 //缩小,缩小的那一部分数据会丢失 //扩大,(连续的) //1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针 //2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址 //3.如果申请失败,返回NULL,原来的指针仍然有效 int addLen =10; //用realloc来扩大内存 //1.原来内存的指针 2.内存扩大之后的总大小 int* p2 = (int*)realloc(arr,(len +addLen) * sizeof(int) ); //重新给新的数组赋值 i = 0; for (; i < len + addLen; i++){ p2[i] = rand() % 200; printf("%d,%#x\n", p2[i], &p2[i]); } 7 释放内存的细节问题
安全释放的例子if (p2 != NULL){ free(p2); p2 = NULL;} 内存泄漏的例子void main(){ //分配40M int* p = (int*)malloc(1024*1024*40); //下一次分配之前,如果不释放,会造成40M的内存泄漏 free(p); p = NULL; //分配80M p = (int*)malloc(1024*1024*80); free(p); system("pause");} 8 本系列 Android NDK 开发之旅 1--C 语言基础--基本数据类型 Android NDK 开发之旅 2--C 语言基础--指针 读者须知 |
|
来自: codingSmart > 《待分类》