一 概述
二 类型
三 语句
四 函数
五 数据
六 内存
七 代码
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1. 动态内存
运行期从堆(heap)上分配内存。其生命周期自分配起,至手动释放为止。
- 编译期无法确定大小。
- 内存指针跨作用域传递。
标准库相关函数:
malloc
: 返回指定大小内存,未初始化。calloc
: 分配num * size
大小内存,零值初始化。free
: 释放内存。realloc
: 重分配(扩大或缩小)已有内存。
以上函数都是 线程安全 (thread-safe)。重分配时,尝试在现有位置进行放大或缩小。如果不成,分配新内存块,复制原有内容,并释放旧内存块。如新分配失败,则旧内存块不变,返回空指针。
memset
: 以特定值填充内存。memmove
: 复制内存。memcpy
: 复制内存。允许重叠(overlap),行为未定。memccpy
: 复制内容,带终止标记。memchr
: 查找指定内容。memcmp
: 内容比较。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { int *p = malloc(sizeof(int)); if (p == NULL) return -1; *p = 100; free(p); return 0; }
匿名内存映射
绕开 glibc,自主管理一大块内存。
- 不需要时,解除映射,没有碎片。
- 可调整大小和权限,比如只读。
- 零值内存,无需额外初始化。
- 可实现零拷贝(zero copy)。
- 按页分配,可能会有内存浪费。
- 比堆分配开销更大,不适合频繁申请操作。
使用
-std=gnu11
,否则MAP_ANONYMOUS
undeclared
。
#include <stdio.h> #include <stdlib.h> #include <sys/mman.h> int main (void) { void *p = mmap(NULL, 512<<10, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (p == MAP_FAILED) { perror("mmap"); return -1; } if (munmap(p, 512<<10) == -1) { perror("munmap"); return -2; } return 0; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论