黑马程序员技术交流社区

标题: 内存管理[视频随记要点] [打印本页]

作者: 你说呢    时间: 2015-7-18 17:20
标题: 内存管理[视频随记要点]
本帖最后由 你说呢 于 2015-7-18 17:23 编辑

内存管理:软件运行时对计算机内存资源的分配和使用的技术;
主要是对用户申请的内存空间的管理;系统运行申请的空间系统会自动回收,
内存空间:



BBS段:用来存放程序中未初始化的全局变量和静态变量
数据段:用来存放程序已经初始化的全局变量和静态变量,字符串常量    (常量区)
代码段:程序执行代码(编译后的代码)
堆:动态分配的内存单元   程序运行过程中申请的动态空间
栈:是用户存放程序临时创建的局部变量


常见的内存分配函数:
Malloc
使用方法:void *malloc(unsigned size)  size是指的分配内存的字节
包含在stdlib.h中,作用是在内存的堆去分配一个大小为size的空间。
分配成功返回分配内存首地址    不成功返回NULL  单词null要大写
使用memset初始化
void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
Calloc
calloc分配
        格式:calloc(块数m,长度n)
分配m块长度为n的连续的内存空间  ,申请成功返回首地址否则NULL  
会自动出自动初始化为0
        
Realloc
relloc  函数可以给已经存在的空间扩充大小
      原先的空间不够会自动找新空间,并拷贝数据,返回新的内存空间的新地址
        int *p =(int *)malloc(4*sizeof(int));
void *__cdecl realloc(void *_Memory,size_t _NewSize);
P=realloc(p,40*sizeof(int));//扩充空间为40个


野指针:
Int *p;定义了指针却没初始化; 申请了空间却没有指针指向,
内存泄露:
int *p=malloc (4*sizeof(int));
程序运完p所指的空间释放了   ,堆里申请的空间没释放造成内存泄露
解决办法:
在在被释放前,要释放堆中内存空间
free函数的使用
定义函数:
Void free(void *p);
free(p)
P=NULL;


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void test(){
        //        从内存中申请一块内存空间,可以存放4个整数
//        赋值要求等号的左右两侧的类型相等
//        p中存放的是新申请的内存空间的首地址
//        注意malloc 申请的内存空间,如果不赋值,则是垃圾数
        int *p =(int *)malloc(4*sizeof(int));
        memset(p,'a',16);
        if(p!=NULL){
//                *p=10;
//                *(p+1)=100;
//                *(p+2)=1000;
//                *(p+3)=10000;
        }else{
                printf("内存申请失败!\n");
        }
        for(int i=0;i<4;i++){
                printf("%c\t",*(p+i));
        }        
}
void test2(){
        //        calloc分配
//        格式:calloc(块数,长度)
//        分配了4块,每一块内存长度为4的内存空间
//        地址是连续的
//        注意事项:可以初始化为0
        int *p =(int *)calloc(4,sizeof(int));
        if(p!=NULL){
                *p=10;
                *(p+1)=100;
                *(p+2)=1000;
                *(p+3)=10000;
        }else{
                printf("内存申请失败!\n");
        }
        for(int i=0;i<4;i++){
                printf("%d\t",*(p+i));
        }
        
}
int main(){
//        relloc  函数可以给已经存在的空间扩充大小
//        返回新的内存空间的新地址
        int *p =(int *)malloc(4*sizeof(int));
        p=realloc(p,40*sizeof(int ));
        if(p!=NULL){
                *p=10;
                *(p+1)=100;
                *(p+2)=1000;
                *(p+3)=10000;
                *(p+39)=1111;
        }else{
                printf("内存申请失败!\n");
        }
        for(int i=0;i<40;i++){
                printf("%d\t",*(p+i));
        }
        return 0;
}
作者: 小蜗牛0519    时间: 2015-7-18 20:00
好深奥!!!
作者: 2899028818    时间: 2015-7-19 07:30
继续加油。。。。。
作者: 562413895@qq.co    时间: 2015-7-19 09:13
图比较给力
作者: 池莉娘子    时间: 2015-7-19 12:33
不好懂啊
作者: huangsailin    时间: 2015-7-19 13:01
总结得很好!谢谢分享!!
作者: skywan    时间: 2015-7-19 13:15
也在研究这个,有点不好懂
作者: 你说呢    时间: 2015-7-19 13:24
skywan 发表于 2015-7-19 13:15
也在研究这个,有点不好懂

的却...多看几遍就行了   
加油吧
作者: 你说呢    时间: 2015-7-19 13:35
小蜗牛0519 发表于 2015-7-18 20:00
好深奥!!!

你学一下也会董的




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