C语言-内存管理 1.内存管理 1.1更灵活的内存管理方式 加载对应的库函数就可以申请动态的内存 对应的头文件 1.2 malloc malloc 函数原型:void *malloc(size_t size) ; malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。 返回的是void类型的函数指针,所以需要强制转换成需要的类型的指针。
1.3 free
注意:free释放完指针,指针还是在原来的位置,并不是野指针或者空指针,只是非法访问了。 2.内存泄露 申请的动态内存没有及时释放,申请了内存空间,没有释放,就会占用电脑的内存 c语言不具备垃圾回收机制 下面的这个程序会卡死,不要轻易尝试,可以在虚拟机尝试。
3.malloc还可以申请一块任意尺寸的内存空间
4.初始化内存空间 下面的方法可以用java的数组Arrays的内置方法做比较来理解,不过c要考虑指针,麻烦了不少。 下面的这些函数与c语言中str开头的也有所不同,str开头的是针对字符串的,这个mem开头的是用来处理内存空间的。
4.1memset 函数声明: 4.2 memcpy 函数声明: 该函数将 src 的 count 个字节复制到 dest。该函数返回 dest 的起始位置。 4.3 memmove 函数声明: 该函数的作用和memcpy类似。但是为什么会有memmove呢? 我们看下面这段代码 我们可能认为答案是 1 2 3 1 2 3 4 5 6 7,但是结果并不是
与memcpy函数相比,memmove函数更加灵活,因为它能够处理源内存块和目标内存块之间可能会发生重叠的情况。在处理重叠的情况时,memmove函数会先将要复制的数据拷贝到一个临时缓冲区中,然后再将数据复制到目标内存块中,从而避免数据损坏或丢失。 5.calloc 申请内存空间,并默认初始化为0,相当于malloc和memset函数的结合应用
6.realloc 是C标准库中的一个动态内存分配函数,用于重新分配已经分配的内存块的大小
注意 该篇文章的内存管理,很多地方都可以理解为java数组的内存管理,以及初始化数组啊之类的。 7.c语言的内存布局 7.1内存布局规律 打印各种变量的地址和函数的地址,看有什么规律
根据上图的运行结果可以发现。下面的规律。
7.1.1代码段
7.1.2数据段
7.1.3 BSS段
8.堆
9.栈
10.栈和堆的区别 10.1生存周期
10.2发展方向 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHgrhMu3-70)(assets/image-.png)]
结果可以看出 栈是从高地址向地址发展的 堆是从低地址向高地址发展的。 11.内存池 如果一直使用malloc和free函数,申请释放内存空间的话,可能会产生内存碎片 就是申请了一片空间,再释放之后,重复多次,每个空间都没有连在一起,就成为了碎片,这样描述是便于理解,不是完全正确 为了解决这个问题,有了内存池
12.位域
==位域的字节必须是小于数据类型的位的,例如,int是32位,所以不能超过32。 12.2无名位域 一般用来填充或者调整成员之间的位置
unsigned int a:1 ; unsigned int b:1 ; unsigned int c:2 ; }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/32753.html