@rfish
2015-08-10T00:44:22.000000Z
字数 1952
阅读 1770
粤嵌
返回viod *
类型的指针,同时为未初始化
的内存空间。
需要显式的进行类型转换
,以及分配失败处理
,初始化
int *p=NULL;
/***************类型转换******************/
p = (int *)malloc(sizeof(int));
/*************分配失败处理****************/
if (p==NULL){
//分配失败处理
}else
/****************初始化处理***************/
memset(p,0,sizeof(int));//初始化处理
memset(void *p,int c,int n )
void *p
:需要初始化的首地址指针c
:需要初始化成什么内容n
:操作的内存空间长度
malloc 申请的空间实际上要偏大,额外空间用来记录
管理信息
(实际上就是一个结构体)
下面是管理信息的结构体:
struct mem_control_block{
int is_available;//标记空间是否可用
int size;
}
high addr +----------+
| |
| |
| 可用内存 |
| |
+----------+
| |
| 管理信息 |
low addr +----------+
注意:写入大小不能超出申请空间的大小,否则会覆写掉后面一块
地址的管理信息
在free中实际上就是将该标记置为可用,即标记为1
在free后及时将指针地址置为空:
free(p);
p=NULL;
注意:使用malloc函数分配的堆空间在程序结束之前必须释放。
void *calloc(int n,int size);
函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间(n个size长度的空间)
calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间
,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
void * realloc(void * p,int n);
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。
- 如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。
- 如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。
- relloc函数分配的空间也是未初始化的。
内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。
#include<sys/types.h>
#include<sys/mman.h>
void *mmap(void *start,size_t length,int port,int flag,int fd,off_t offset)
- start为指针通常设为NULL,表示映射内存有系统决定。因为指定内存会经常出错。
- length为内存映像占用的内存空间大小。以字节为单位。
- port表示内存映像的安全性。
- PROT_EXEC表示被映像内存可能有机器码,可执行。
- PORT_NONE表示被映像内存不能被访问。
- PORT_READ表示被映像内存可读
- PORT_WRITE表示被映像内存可写
- flag内存映像标志:
- MAP_FIXED表示如果无法从start地址建立内存映像,则出错返回。
- MAP_PRIVATE表示对内存映像进行的改动不反映到外存文件中。
- MAP_SHARED表示对内存映像进行的改动反映到外存文件中。
- fd文件描述符
- offset表示所映像的内容距文件头的距离。
int munmap(void *start,size_t length);
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中