c/c++动态分配内存
为什么需要动态分配内存
---很好的解决的了传统数组的4个缺陷
动态内存分配举例
---动态数组的构造
使用动态数组的优点:
1. 动态数组长度不需要事先给定;
2. 内存空间可以手动释放;
3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小
静态内存和动态内存的比较
静态内存是由系统自动分配,有系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的
动态内存和静态内存的比较
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的
难点
/* 2009年11月17日10:21:31 malloc 是 memory(内存) allocate(分配)的缩写 */ # include <stdio.h> # include <malloc.h> //不能省 int main(void) { int i = 5; //分配了4个字节 静态分配 11 行 int * p = (int *)malloc(4); //12行 /* 1. 要使用malloc函数,必须添加malloc.h这个头文件 2. malloc函数只有一个形参,并且形参是整型 3. 4表示请求系统为本程序分配4个字节 4. malloc函数只能返回第一个字节的地址 5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节 6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的 */ *p = 5; //*p 代表的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不同 free(p); //freep(p)表示把p所指向的内存给释放掉 p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 printf("同志们好! "); return 0; }
malloc的用法:
demo1 .
# include <stdio.h> # include <malloc.h> void f(int * q) { //*p = 200; //error //q = 200; //**q = 200; //error *q = 200; //free(q); //把q所指向的内存释放掉 本语句必须的注释掉,否则会导致第20行的代码出错 } int main(void) { int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数 *p = 10; printf("%d ", *p); //10 f(p); //p是int *类型 printf("%d ", *p); //200 第20行 return 0; }
demo2.
# include <stdio.h> # include <malloc.h> int main(void) { // int k; int * p = (int *)malloc(4); /* malloc函数的返回值是void * void * 也叫干地址 所谓干地址就是无实际意义的地址 */ free(p); //把p指向的内存释放 return 0; }
动态一维数组示例:
# include <stdio.h> # include <malloc.h> int main(void) { int a[5]; //如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用 int len; int * pArr; int i; //动态的构造一维数组 printf("请输入你要存放的元素的个数: "); scanf("%d", &len); pArr = (int *)malloc(4 * len); //第12行 本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr, 该数组的每个元素是int类型 类似于 int pArr[len]; //对一维数组进行操作, 如:对动态一维数组进行赋值 for (i=0; i<len; ++i) scanf("%d", &pArr[i]); //对位一维数组进行输出 printf("一维数组的内容是: "); for (i=0; i<len; ++i) printf("%d ", pArr[i]); free(pArr); //释放掉动态分配的数组 return 0; }
示意图: