C语言之动态内存分配

来源:互联网 发布:淘宝卖家代理怎么发货 编辑:程序博客网 时间:2024/06/04 20:03
堆区,栈区,常量区,全局区,静态区,代码区(编译后的二进制码)


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








/**  * 存储区的划分:     

(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//解决方案:使用玩内存后,要将内存立即释放掉.


//让指针变量p指向一个明确的空间,而且空间必须是可控的.     

char*p =0x1000000789;     

*p ='a’;

inta =0;     

printf("请输入一个整数:\n");     

scanf("%d", &a);     

charstr[20] ="iPhone";

//    printf("%s%d\n", str, a);     

/**      *  printf:用来将内容输出到控制台         

sprintf:用来将内容输出到内存中      */     

sprintf(str,"iPhone%d", a);     

printf("%s\n", str);


0 0