A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 你说呢 中级黑马   /  2015-7-18 17:20  /  1061 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 你说呢 于 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;
}

8 个回复

倒序浏览
好深奥!!!
回复 使用道具 举报
继续加油。。。。。
回复 使用道具 举报
图比较给力
回复 使用道具 举报
不好懂啊
回复 使用道具 举报
总结得很好!谢谢分享!!
回复 使用道具 举报
skywan 中级黑马 2015-7-19 13:15:40
7#
也在研究这个,有点不好懂
回复 使用道具 举报
skywan 发表于 2015-7-19 13:15
也在研究这个,有点不好懂

的却...多看几遍就行了   
加油吧
回复 使用道具 举报

你学一下也会董的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马