动态内存分配

来源:互联网 发布:钢琴演奏软件 编辑:程序博客网 时间:2024/06/09 15:40
堆区,栈区,常量区,全局区,静态区,代码区(编译后的二进制码)


//解决方案:让空间在函数执行完毕之后,系统不会收即可,定义成全局变量或者静态变量,或者再堆区开辟空间.





/** *  存储区的划分:    (1)栈区:栈区存储局部变量,栈区的内存是由系统自动管理,系统开辟,系统回收,无需程序员管理.    

(2)堆区:通过堆区内存分配函数,分配的空间都在堆区,堆区的最大特点:堆区的空间需要程序员手动管理,手动开辟,手动释放.(OC常用)    

(3)常量区:对于字符常量,整形常量,浮点型常量,字符串常量统一存储在该区,该区的内存由系统自动管理,特点:常量区的内容不可修改.    

(4)静态区,全局区:存储全局变量以及静态变量.内存由系统管理,但是在程序的运行期间空间都不会释放.    

(5)代码区:编译之后形成的CPU指令存储在该区.   

概念局部变量:在函数内部定义的变量,数组.(栈区)       

           全局变量:在函数外部定义的变量,数组.(全局区)       

静态变量:static修饰的变量.(静态区) */



//堆区内存分配函数   

//malloc,需要指定需要开辟的空间大小   

//返回在堆区开辟的空间的地址   

//void *是一个泛型,可以代表所有的指针类型   

//比如: char *, int *, float *, Student *,    

char *p =malloc(8);//确定开辟的空间要存储的数据//    

p = "android"; //常量区变量不可更改.   

strcpy(p,"Android");   

printf("%s\n", p + 4);    

*(p +4) ='b';   

printf("%s\n", p + 3);   

free(p);//释放堆区内存,删除只是标记删除,不会删除内容   

//free(p);   

//1.野指针错误   

//产生原因:访问不该访问(已经没有使用权,空间已经释放,还给系统)的内存.   

//解决方案:释放内存的所有权的同时将地址也清除掉.    

p = NULL;//指向无效的区域   

//2.过度释放   

//产生原因:对一块内存释放(free)多次.   

//解决方案:保证只释放(free)一次,将其他的释放操作删掉.(会立即carsh)   

//3.内存泄露   

//产生原因:分配了内存使用完以后,没有释放掉,造成内存堆积,最后会因为没有内存可分配,而造成程序crash   

//解决方案:使用玩内存后,要将内存立即释放掉.

0 0
原创粉丝点击