返回介绍

1. 动态内存

发布于 2024-10-12 21:58:09 字数 1742 浏览 0 评论 0 收藏 0

运行期从堆(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_ANONYMOUSundeclared

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文