动态内存分配
内存分为5个部分:
1.栈区2.堆区3.静态区4.常量区5.代码区
栈区
特点:栈区的特点是从高到低得从大到小得顺序,先进后出的规则
int a = 2 中a 是存储在栈区里面的,变量的定义函数的参数都是存储在栈区里面的
int b = 3 如果按照这个顺序定义的话,那么先进栈的是a后进栈的shib先出栈的是b后出栈的是a
堆区
分配内存和栈区相反,从低到高的过程
那么什么东西存储在堆区呢?
堆区是给开发人员准备的,由开发人员自己分配和释放,但是注意,要记着释放,如果不释放会导致内存不沟通的问题
堆区内存分配函数
int *c = malloc(sizeof(int) * 5)分配5个int型大小的内存
堆区内存相对较小
静态区
关键词static(静态)
全局变量,被static修饰的静态变量
静态变量一次程序运行只分配一次内存
常量区
字符,数组等都存储在常量区,常量去里面的值不可以修改
代码区
在内存的最底下,函数名是地址
程序执行的代码都保存在代码区
程序编译时崩溃的原因有可能是常量被修改
当程序执行完毕要记得释放内存
操作内存函数
对内存分配函数
1.malloc函数
返回值void*代表任何指针
参数:分配内存的大小,按字节计算
考虑到平台的不同,可以用sizeof(int/char...)来定子字节数
使用举例
在堆区分配8个字节
char *str = malloc(sizeof(char) * 8);
堆区中malloc对内存的分配不负责清空
也可以用该函数分配结构体类型内存
分配以后,被分配的内存有标记,不可再被使用,所以别的分配函数不可以再分配这段内存空间系统标记告诉系统自己,无返回值,有一个参数,填任意类型的指针,但是指针类型和参数类型要匹配好,当释放的时候,标记
该为可用,其他分配内存的函数就可以再把这段内存分配出去
释放内存的时候只是对内存标记为可用,并没有对内存进行清空,数据还在,要重新添加数据才能把原来的数据刷新掉
其他内存管理函数
calloc作用和malloc一样,只不过malloc不清空内存,calloc清空内存,所以效率会相对低一点
char *str = calloc(2, sizeof(char));
参数1:分配多少个内存
参数2:每个内存有多大,也就是多少个字节重新分配内存大小函数:realloc作用:以前定义的函数大小不够用得时候再一次分配
str = realloc(str, 100);
参数1:给谁分配
参数2:重新分配大小
内存操作函数:memset(str,6, 20)
1.初始化内存函数
参数1:初始化谁
参数2:初始化的值
参数3:初始化多少字节
2.内存拷贝函数 : memcpy
参数1:拷贝到谁
参数2:拷贝谁
参数3:拷贝多少字节
跟字符串拷贝的区别:字符串只能拷贝字符串,内存拷贝可以拷贝任何内容
3.内存比较函数:memcmp
参数1和参数2:比较两块内存
参数3:比较多少个字节
如果两个内存完全相同返回0
如果不一样,就把不一样的内存内容取差值,前面的减去后面的然后返回