动态内存分配
2014-04-10 18:31
399 查看
动态内存分配【重点难点】
传统数组的缺点:
1.数组长度必须事现指定,且只能是常整数,不能是变量
例子:
int a [5]; //OK
int len = 5; int a [len]; //error
2.传统形式定义的数组,该数组的内存程序员无法手动释放
数组一旦定义,系统就为该数组分配的存储空间就会一直存在,除非数组所在的函数运行结束
或者说:
在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放
3.数组的长度不能在函数运行的过程中动态的扩充或缩小
数组的长度一旦定义,其长度就不能再更改
4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法再被其他函数使用
传统方式定义的数组不能跨函数使用
下面举个例子,简单说明一下传统数组的缺陷
例1:
输出结果为:
为什么需要动态内存分配内存
动态数组很好的解决了传统数组的这4个缺陷
传统数组也叫静态数组
动态的分配内存,就要用到malloc函数,malloc是 memory(内存)allocate(分配)的缩写
下面举个例子
例2:
输出结果为:
注意:
1、要使用malloc函数,必须添加malloc.h这个头文件
2、malloc函数只有一个形参,并且形参是整型
3、4表示请求系统为本程序分配4个字节
4、malloc函数只能返回第一个字节的地址
5、7行分配了8个字节,p变量占8个字节,p所指向的内存也占8个字节
6、p本身所占的内存是静态分配的,p所指向的内存是动态分配的
再举一个例子
例3:
静态内存和动态内存的比较
静态内存是有系统自动分配,由系统自动释放
静态内存是在栈中分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆中分配的
下面是一个动态一维数组的构造
例4:
输出结果为:
【所有代码均在windows系统下VC++6.0下运行通过】
(如有错误,敬请指正)
传统数组的缺点:
1.数组长度必须事现指定,且只能是常整数,不能是变量
例子:
int a [5]; //OK
int len = 5; int a [len]; //error
2.传统形式定义的数组,该数组的内存程序员无法手动释放
数组一旦定义,系统就为该数组分配的存储空间就会一直存在,除非数组所在的函数运行结束
或者说:
在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放
3.数组的长度不能在函数运行的过程中动态的扩充或缩小
数组的长度一旦定义,其长度就不能再更改
4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法再被其他函数使用
传统方式定义的数组不能跨函数使用
下面举个例子,简单说明一下传统数组的缺陷
例1:
# include <stdio.h> void g(int * pArr) { pArr[2] = 88; //pArr == a[2] } void f(void) { int a[5] = {1, 2, 3, 4, 5}; // 20个字节的存储空间程序员无法手动编程释放它, //它只能在本函数运行完毕时由系统自动 g(a); printf("%d\n", a[2]); } int main(void) { f(); return 0; }
输出结果为:
为什么需要动态内存分配内存
动态数组很好的解决了传统数组的这4个缺陷
传统数组也叫静态数组
动态的分配内存,就要用到malloc函数,malloc是 memory(内存)allocate(分配)的缩写
下面举个例子
例2:
# include <stdio.h> # include <malloc.h> //不能省 int main(void) { int i = 5; //分配了4个字节 静态分配 6行 int * p = (int *)malloc(sizeof(int)); //7行 *p = 5; // *p 代表的就是一个int型变量,只不过*p这个整型变量的内存分配方式和7行的i的分配方式不同 free(p); //free(p)表示把p所指向的内容给释放掉 p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时,由系统自动释放 printf("同志们好!\n"); return 0; }
输出结果为:
注意:
1、要使用malloc函数,必须添加malloc.h这个头文件
2、malloc函数只有一个形参,并且形参是整型
3、4表示请求系统为本程序分配4个字节
4、malloc函数只能返回第一个字节的地址
5、7行分配了8个字节,p变量占8个字节,p所指向的内存也占8个字节
6、p本身所占的内存是静态分配的,p所指向的内存是动态分配的
再举一个例子
例3:
# include <stdio.h> # include <malloc.h> void f(int * q) { // *p = 200; //error // q = 200; //error // **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\n", *p); //10 f(p); //p是int * 类型 printf("%d\n", *p); //200 20行 return 0; }输出结果为:
静态内存和动态内存的比较
静态内存是有系统自动分配,由系统自动释放
静态内存是在栈中分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆中分配的
下面是一个动态一维数组的构造
例4:
# 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(sizeof(int) * len); // 14行 本行动态的构造了一个一维数组,该一维数组的长度是1en,数组名是pArr,该数组的每个元素是int类型 类似于intpArr[len] //对一维数组进行操作 如:对一维数组进行赋值 for(i=0; i<len; ++i) scanf("%d", &pArr[i]); //对一维数组进行输出 printf("一维数组的内容是:\n"); for(i=0; i<len; ++i) printf("%d\n", pArr[i]); free(pArr); //释放掉动态分配的数组 return 0; }
输出结果为:
【所有代码均在windows系统下VC++6.0下运行通过】
(如有错误,敬请指正)
相关文章推荐
- iOS 获取手机所有app信息
- 笔试题
- XAMPP的错误Error: Apache shutdown unexpectedly.
- XAMPP的错误Error: Apache shutdown unexpectedly.
- 序列化与对象克隆
- 编写的windows程序,崩溃时产生crash dump文件的办法
- Android中监听EditText文本输入
- Mysql-存储过程和存储函数笔记
- Java中的变量
- 线程池
- 爽翻了?360安全浏览器7.0速度体会!
- 数据结构--基本概念
- 进度条样式
- tuscany部署问题
- struts2框架校验
- android读取txt文本资源文件
- 苹果电脑上的Command(花键)图案键的图标设计来源
- C++设计模式之观察者模式
- ORA-01789: 查询块具有不正确的结果列数
- I88042