主要内容:程序存储区的划分、动态申请内存、内存操作函数
一、程序存储区的划分
栈区:内存地址最大,先进后出,开辟出空间后不能自己释放
堆区:内存空间最大,malloc等内存分配函数分配的内存(手动申请,手动释放)
全局区(静态区):存放全局变量的区,在任何变量的前面加static,该变量就会被放入静态区,并且该变量只能
被初始化一次,只有程序退出才释放(永远存在)
常量区:存放常量的(常量占用内存,为可读状态,不能被修改,否则运行崩溃)
代码区:所有的语句编译后生成的CPU指令存储到代码区
内存地址从高到低,内存空间最大的时堆区
二、堆内存分配函数
malloc()内存分配函数
手动申请内存空间,不会主动把空间清0,内存中的初始值可能不是0
特点:效率高,不安全
示例:
int *arr = malloc(sizeof(int)* 4);/ / 手动申请内存
free(arr);/ / 释放内存(释放方式是:标记删除)
手动申请4个整型大小的内存
int *arr1 = malloc(4);/ / 可以存放一个int类型的元素
short *arr2 = malloc(4);/ / 可以存放两个short类型的元素
calloc()内存分配函数
手动申请内存空间,并且会主动把空间清0
特点:效率低,安全
示例:
int *arr = calloc(sizeof(int)* 4)/ / 手动申请4个整型大小的内存,并且初始值全部清0
free(arr);/ / 释放内存
relloc()内存分配函数
感觉原来分配的空间不够用,重新申请分配内存
一般都是从小往大了申请,不建议从大往小了申请(容易丢失数据)
示例:
int *arr = malloc(sizeof(int)* 4);/ / 申请内存
realloc(arr,10);/ / 重新申请内存
free(arr);/ / 释放内存
三、内存操作函数
memset()
初始化内存void memset(void *s,int c,size_t n)
从s指向的内存开始初始化n个字节的内容为c
示例:
char *name = malloc(sizeof(char)*10);/ /申请内存
memset(name,' a ',10);/ / name从哪里开始初始化
/ / 初始化的内容
/ / 长度
free(name);/ / 释放内存
memcpy()
内存拷贝void mescpy (void dest,const void source,size_t n)
从source指向的内存开始拷贝到dest,拷贝n个字节
示例:
char *name1 = malloc(sizeof(char)* 10);/ / 申请内存
memcpy(" iPhone ",name1,3);/ / 执行拷贝
free(name1);/ / 释放内存
free(name2);/ /释放内存
memcmp()
内存比较int memcmp(const void *buf1,const void *buf2,unsigned int count);
比较buf1和buf2指向的内存是否相同,比较count个字节
示例:
char *arr1 = malloc(sizeof(char)*5);
char *arr2 = malloc(sizeof(char)*5);
arr1 = " iPhone ";
arr2 = " iPad ";
int result = memcmp(arr1,arr2);
printf(" %d ", result);