设为首页 加入收藏

TOP

C语言 内存管理精讲(malloc,calloc,free,relloc使用)
2014-11-23 23:33:40 来源: 作者: 【 】 浏览:2
Tags:语言 内存 管理 精讲 malloc calloc free relloc 使用

内存管理


自定义类型
简单的用一个新的类型名代替原有的类型名


typedef int Integer;
int i,j;
Integer k;


//声明结构体
typedef struct{


int month;
int day;
int year;
}Date; //用typedef 生命的结构体,原结构体变量变成了一个新的类型了


Date birthday;
Date *p;


//定义数组
typedef int Num[100];
Num a;


//定义指针
typedef char *String
String p,s[10];


//定义返回值为int类型无参数的函数指针
typedef int (*pointer)();
pointer p1,p2;


###
typedef 只是对已经存在的类型制定一个新的类型名,而没有创造新的类型
用typedef声明数组类型 指针类型 结构体类型 共用体类型 枚举类型等
typedef 与 #define 表面上有相似之处
当不同的源文件中用到同一类型的数据时,常用typedef声明一些数据类型,可以吧所有的typedef名称声明单独放在一个头文件中
使用typedef名称有利于程序的通用与移植,有时程序会依赖与硬件的特性,用typedef类型便于移植。


------------------------------------------------------------------------


使用位域定义与结构体相仿
格式:
struct 位域结构名{

类型说明 位域名:位域长度;


}


位域长度不能超过该类型的位数
可以将该类型所占的其他位忽略
可以无位域名,表示填充或者调整位置


例如:
struct sta{


unsigned int a:4; //占用半个字节 4位
unsigned int :0; //空域 第一个字节的剩余位全清零
unsigned int b:4; //占用半个字节 4位
unsigned int c:4; //占用半个字节 4位


}
>>>>>


| a | 空 |
| b | c |

再例如:
struct stb{


int a:1; //占用1位
int :2; //表示 2个位 不用
int b:3; //占用3位
int c:2; //占用2位


}


| a 1 | 空 2 | b 3 | c 2 | //共占8个位


------------------------------------------------------------------


动态内存管理
非静态的局部变量是分配在内存中的动态存储区,这个存储区是一个称为 栈 的区域


如:int a 存放在栈区


C语言 还允许建立动态分配区域,以存放一些临时用的数据,这些数据需要随时开辟,不需要的时候试试释放,这些数据是临时存放在一个特别
的自由存储区,成为 堆 区


如:全局变量 内存管理的手动分配单元 静态变量都是存在 堆区


关于静态和动态
静态内存分配是在程序执行之前进行的,因而效率比较高,但是它缺少灵活性,要求在程序执行之前,就知道所需要的内存的类型和数量
静态对象是有名字的变量,我们直接对起进行操作,而动态的对象是没有名字的变量,我们通过指针间接的对他进行操作
静态对象由编译器自动释放处理,动态变量需要手工释放


方法:


malloc
calloc
free
realloc


1、malloc(大小) 分配到堆区
void * malloc(usingned int size);单位是(byte)字节数
其作用是在内容的动态存储区分配一个长度位 side 空间,此函数是一个指针型函数,返回的指针是该分配区域的开头的位置(或首地址)
注意指针的类型位void 即不指向任何类型的数据,只提供一个地址。放什么类型的数据,强制转换位什么类型。
如果函数未能成功申请到空间(内存不足),返回空指针 NULL


如:
//分配40个字节的连续空间,让a指向新空间的首地址
int *a =(int*)malloc(40);
//判读是否申请成功
if(a == NULL){


}


========================
练习:申请两个Student类型的空间


struct Student stu;
*p = (struct *Student) malloc(sizeof(struct Strdent)*2);
//判断
if(p==NULL){


}


另一种:使用typedef
typedef struct Student{


…..
……
}stu;


stu *p = (stu*) malloc( sizeof(stu)*2 );
//判断
if(p==NULL){


}
=========================


2、 calloc(数量,大小) 分配到堆区


viid * calloc(unsigned n,unsigned size); 上例改为 int a = sizeof(stu); stu *b = (stu*) calloc(2,a);
其作用是在内存的动态存储区中分配n个长度位 size的连续空间,这个空间一般比较大,足以保存一个数组
可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度位size,这就是动态数组。


calloc ----->malloc
如:calloc(m,n) ---->malloc(m*n);


malloc ----->calloc
如:malloc(a) ---->calloc(1,a);


例如:int *a = (int*)calloc(10,sizeof(int)); if(a==NULL) 40个字节,等于分配长度为 10 的一维数组


3、free(指针变量)
void free(void *p); p=NULL;
其作用是释放指针变量p所指向的动态空间,这部分空间能重新被其他变量使用,p应是最近一次调用calloc或malloc函数时得到的函数返回值
free(p)释放指针变量p所指向的已分配的动态空间,但是注意,当p被释放后,p变为野指针,所以一定要加一句 p=NULL或p=0;
free函数无返回值
动态分配的空间用完后,必须要释放。


***** 注意 *****
在使用malloc或者cmalloc申请空间时,如 int *p = (int*)malloc(40);
p指针不允许进行 ++p 或者 --p,这样将导致 部分内存区域无法归还,导致内存泄露。


4、realloc(指针,大小)
void *realloc(void *p,unsigned int size);
如果已经通过malloc函数获取到了动态的空间,想改变大小,可以使用relloc函数重新分配
用realloc 函数讲p所指向动态空间的大小改为size,p的值不变,如果重新分配不成功,返回NULL( "p=(int*)relloc(p,20)" 这句话有问题,一旦重新分配不成功,p=NULL,将会导致p指向的原来的空间也无法找到,无法归还,将导致内存泄露);

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言文件输入/输出ACM改进版(fre.. 下一篇浅谈变量的原始值、存储状态、实..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: