黑马程序员技术交流社区

标题: 动态内存管理 [打印本页]

作者: qq103613    时间: 2015-8-2 20:08
标题: 动态内存管理
#include <stdlib.h>

1) malloc
(void *)malloc(unsigned size) //动态的向内存申请连续的n个字节 返回的是新申请的内存空间的首地址
int *p = (int *)malloc(100); //p是在栈区 malloc(100) 在堆区
malloc不会把新申请的空间初始化

注意:判断一个空间是否申请成功
if(p!=NULL){
    //执行语句
}else{
    //分配不成功
}   //只有申请成功了,才能操作

memset(p,'0',100); //全部初始化为0


2) calloc
int *p = (int *)calloc(5,4); //申请5个长度为4的空间
calloc可以把新申请的空间初始化0

注意:判断一个空间是否申请成功
if(p!=NULL){ //只有申请成功了,才能操作
}else{
    //分配不成功
}


3) realloc
重新改变一块内存空间的大小 p = (int *)realloc(p,size);

4) free
释放我们指定的内存空间
free(p); //p是我们新申请的内存单元 free后,p是一个野指针
如果不释放,造成内存的泄露


推理过程  只需要记住 我们使用了malloc或者calloc记的要free释放
/*
1)p(p释放了,空间没释放)   ---->   这块动态内存空间的首地址
p是局部的指针变量  p被释放了    这块动态内存空间就放在这里浪费了   没法被使用

2)p(空间先释放,p后释放)   ---->   这块动态内存空间的首地址
这块动态内存空间的被free函数释放了,p还没有被释放,这个p就是野指针了
p = NULL
*/



5、指针和函数之间的关系
1)返回值是指针的函数 指针函数
char * getday(){
    return "星期一";
}

值传递 会开辟内存空间
地址传递不会开辟内存空间


2)函数指针
指向函数的指针

格式:返回值 (*指针变量名)(函数的参数);
int sum(int a,int b){
    return a+b;
}

格式一:int (*p1)(int a,int b); // 函数指针p1 只能指向返回值是int类型,并且有两个int 类型参数的函数。
格式二:int (*p2)(int,int);

技巧:
声明的格式:int sum(int a,int b);

int (*p3)(int a,int b) = sum;
p3 = sum;

注意:
    函数指针变量不能进行算术运算
    函数调用中(*指针变量名)两边的括号不可省





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