黑马程序员技术交流社区

标题: c语言学习心得——内存管理 [打印本页]

作者: vyqrvwgf    时间: 2015-11-2 17:45
标题: c语言学习心得——内存管理
1.c语言内存管理的内容
        对计算机内存资源的分配和使用。高效快速地分配,并且在适当的时候释放和回收内存资源。
2.内存的分区
        栈区        :是用户存放程序临时创建的局部变量。
        堆区        :动态分配的内存段。       
        bss段:未初始化的全局变量和静态变量。
        数据区:已经初始化的全局变量和静态变量,字符串常量。
        代码区:程序执行代码的一块内存区域。
3.内存的分配
        1)从静态区域分配
                int a=10;
                内存在编译的时候分配。
        2)在栈上创建
                函数内部局部变量的储存单元都可以在栈上创建。
        3)从堆上分配(动态分配)
4.动态分配的函数(stdlib.h)
        1)malloc
                void *malloc(unsigned size);
                在堆区分配一个连续的,大小为size字节的空间,如果分配成功,返回内存的首地址,如果分配失败,返回null
       
  1. #include<stdio.h>
  2.                 #include<stdlib.h>
  3.                 int main(int argc,const char *argv[]){
  4.                         //等号两边类型一致。
  5.                         int *p=(int*)malloc(4*sizeof(int));
  6.                         if(p!=NULL){
  7.                                 //代码       
  8.                         }else{
  9.                                 printf("内存申请失败\n");
  10.                         }
  11.                 return 0;
  12.                 )
复制代码

                //注意:1)malloc申请的内存空间如果不赋值,存放的是垃圾数。
                          2)使用一个函数对malloc函数申请空间初始化
                                memst(p,A,sizeof(int)*4);
                               表示把malloc函数申请的空间的内容全部初始化为A
        2)calloc
                calloc(快数,长度)
                int *p=(int *)calloc(4,sizeof(int));
                calloc可以自动初始化为0
        3)relloc
                relloc(p,40*sizeof(int));
                给已经存在的空间扩展到指定大小
                1)如果没有36个连续的p地址之后的内存空间,则在新位置扩展40个新空间,把旧内容拷贝过去。
                2)如果有36个连续的p地址之后的内存空间,则直接扩展。
                安全起见 :p=relloc(p,40*sizeof(int));重新指向。
5.内存泄露
  1. #include<stdio.h>
  2.         #include<stdlib.h>
  3.         int main(int argc,const char *argv[]){
  4.                 int *p=malloc(100);
  5.          return 0;
  6.          }
复制代码

        当代码块结束时,存在栈区的局部变量p被释放,但是在堆区申请的100字节大小的内存空间一直存在,这样就会造成内存泄露。
        解决方法释放p之前,先释放堆区中的内容,使用free函数。
  1. #include<stdio.h>
  2.         #include<stdlib.h>
  3.         int main(int argc,const char *argv[]){
  4.                 int *p=(int *)malloc(100);
  5.                 *(p+1)=100;
  6.                 free(p);
  7.                 p=NULL;
  8.                 return 0;
复制代码

                 //先释放空间,再让指针指向NULL,如果不指向NULL,p成为一个野指针。
作者: b31b33b34    时间: 2015-11-2 17:46
66666666666666666666666666666666666666666666666611
作者: b31b33b34    时间: 2015-11-2 18:11
非常厉害,,,受到了很多启发
作者: 任子杰    时间: 2015-11-2 19:43
写的不错
作者: lixp    时间: 2015-11-2 19:46
不错,学习了
作者: p495416980    时间: 2015-11-2 21:04
不错   很仔细
作者: jy00889669    时间: 2015-11-2 21:18
厉害厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2