[关闭]
@rfish 2015-08-10T00:44:22.000000Z 字数 1952 阅读 1770

C内存

粤嵌


1. malloc


1.1 malloc基本

返回viod *类型的指针,同时为未初始化的内存空间。
需要显式的进行类型转换,以及分配失败处理初始化

  1. int *p=NULL;
  2. /***************类型转换******************/
  3. p = (int *)malloc(sizeof(int));
  4. /*************分配失败处理****************/
  5. if (p==NULL){
  6. //分配失败处理
  7. }else
  8. /****************初始化处理***************/
  9. memset(p,0,sizeof(int));//初始化处理

memset(void *p,int c,int n )

  • void *p:需要初始化的首地址指针
  • c:需要初始化成什么内容
  • n :操作的内存空间长度

1.2 与new的区别

1.3 其他

malloc 申请的空间实际上要偏大,额外空间用来记录管理信息(实际上就是一个结构体)

下面是管理信息的结构体:

  1. struct mem_control_block{
  2. int is_available;//标记空间是否可用
  3. int size;
  4. }
  1. high addr +----------+
  2. | |
  3. | |
  4. | 可用内存 |
  5. | |
  6. +----------+
  7. | |
  8. | 管理信息 |
  9. low addr +----------+

注意:写入大小不能超出申请空间的大小,否则会覆写掉后面一块地址的管理信息

1.4 关于free

在free中实际上就是将该标记置为可用,即标记为1
在free后及时将指针地址置为空:

  1. free(p);
  2. p=NULL;

注意:使用malloc函数分配的堆空间在程序结束之前必须释放。

2. calloc


    void *calloc(int n,int size);

函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间(n个size长度的空间)

calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

3. realloc


    void * realloc(void * p,int n);

其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。
- 如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变
- 如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。
- relloc函数分配的空间也是未初始化的。

4. linxu 内存映像


4.1 内存映射

内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。

  1. #include<sys/types.h>
  2. #include<sys/mman.h>
  3. 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表示所映像的内容距文件头的距离。

4.2 撤销内存映射

    int munmap(void *start,size_t length);  

5.函数

5.1 mamcpy

函数原型:

    void *memcpy(void *dest, const void *src, size_t n);

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注