为什么需要动态分配内存?
因为动态数组可以解决静态数组的缺陷
(1).静态数组长度必须先指定,并且只能是常整数,而且也不能为变量(长度不能为不确定的数)
(2).静态数组,程序员无法手动释放内存
(3).静态数组确定后 无法更改(不能自主的扩充或缩小)
(4).静态数组不能跨函数调用
动态内存分配--动态数组的构造
e.g:
int *p = (int *)malloc(int Len);
//表达式左侧是静态分配的 占用4个字节(int),右侧是动态分配的,含有Len个字节
1.malloc只有一个int型参数,表示要求系统分配的字节数
2.malloc函数的功能是请求系统分配Len个字节的内存空间,如果分配成功则返回第一个字节地址,若不成功则返回NULL
malloc函数只能返回第一个字节的地址,把这个地址转化为一个实际意义的地址,malloc前必须加(数据类型 *),表示把空类型转化为对应数据类型的地址
e.g:
int *p = (int *)malloc(50);
//表示把系统分配的50个字节的第一个字节转化为int*型的地址,再准确的说就是把第一个字节的地址转化成4个字节的地址;
P指向第一个4字节 P+1指向第2个地址 P[0]第一个元素 P[i]就是i+1个元素
动态内存的释放free(p);//表示把p指向的内存释放 P本身的内存是静态的
静态内存 和 动态内存比较
静态内存是由系统自动分配的,由系统自动释放
静态内存是在栈分配的
动态内存是有程序员手动分配的,由程序员手动释放
动态内存是在堆中分配的
(使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。 (引用其他的大神的 有兴趣的同学可以自行研究) )
跨函数使用内存的问题(重点)
静态内存不可以跨函数使用
所谓静态内存不可以跨函数使用的具体是:
静态内存在函数执行期间 可以被其他函数使用
在执行完毕之后就不能在被其他函数使用
动态内存可以跨函数使用
动态内存在函数执行完毕之后仍可以被其他函数调用
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。