C语言内存

1. malloc

1.1 malloc基本

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

int *p=NULL;
/***************类型转换******************/
p = (int *)malloc(sizeof(int));
/*************分配失败处理****************/
if (p==NULL){
//分配失败处理
}else
/****************初始化处理***************/
memset(p,0,sizeof(int));//初始化处理
memsetvoid *p,int c,int n )
  • void *p:需要初始化的首地址指针
  • *c:需要初始化成什么内容
  • n :操作的内存空间长度

1.2 与new的区别

  • new返回指定类型的执政并可以自动股计算所需的大小
  • malloc必须自己计算字节数并在返回后强制转换为实际类型的指针

1.3 其他

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

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

struct mem_control_block{
    int is_available;//标记空间是否可用
    int size;
}

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

1.4 关于free

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

free(p);
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 内存映射

内存映像其实就是在内存中创建一个和外存文件完全相同的映像。用户可以将整个文件映射到内存中也可以部分映射到内存。系统会将对内存映像的改动如实的反映到外存文件中。从而实现了通过内存映像对外存文件的操作。
#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表示所映像的内容距文件头的距离。

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所指的内存地址的起始位置中

5.2 memset

函数原型:

void *memset(void *s, int ch, unsigned n);

作用:将已开辟内存空间 s 的首 n 个字节的值`设设置为值 ch。

5.3 strstr

函数原型:

extern char *strstr(char *str1, const char *str2);

语法:

strstr(str1,str2);
  • str1: 被查找目标 string expression to search.
  • str2: 要查找对象 The string expression to find.

返回值:若str2是str1的子串,则先确定str2在str1的第一次出现的位置,并返回此str1在str2首位置的地址。;如果str2不是str1的子串,则返回NULL。

5.4清屏

printf("\033[2j");

5.5 typeof

通过变量获取变量类型。

int a;//a是int型
typeof(a) b; //typeof(a) 实际上就是int
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值