微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中malloc的惯用宏?

如何解决C中malloc的惯用宏?

背景

在与 C++ 一起为高级项目工作一段时间后,我正在学习低级开发。目前正在对典型的 C 模式胡言乱语,并在 linux 内核和旧电子邮件的各个方面磕磕绊绊。

问题

是否有一组常用/惯用的宏或通用函数来减少内存分配中的重复或错误

我在我的代码中经常看到的东西是 malloc 内部的长乘法语句,我认为它很乏味,而且是解决问题的成熟场所。 示例:

struct my_struct {
    size_t size;
    char* memory;
}

struct my_struct* my_struct_new(size_t size) {
    struct my_struct* ms = malloc(sizeof *ms)
    
    ms->size = size;
    ms->memory = malloc(size * sizeof *ms->memory);

    return ms;
}

我试图通过在这里尝试失败来避免造成 XY 问题。

感谢您抽出宝贵时间。

解决方法

不,这几乎是 C 中分配内存的惯用方式。*alloc 函数不知道也不关心类型,它们只关心您想要多少字节。获得该数字的最佳方法(对于字符串或字节缓冲区以外的其他内容,无论如何)是将目标的大小 (sizeof *ms->memory) 乘以您想要的元素数 (size)。否则您可以使用 calloc 将这些内容作为单独的参数传递,但 calloc 会将内存零初始化,这可能是您想要的,也可能不是。

您可以而且应该将复杂的分配抽象到它们自己的函数中(就像这个片段一样)。但就任何现有的便利宏而言 - 并非如此。

,

是否有一组常用/惯用的宏或通用函数来减少内存分配中的重复或错误?

不是真的,@John Bode 已经涵盖了大部分内容。

struct my_struct 创建一个分配器函数 - 在 C 中非常惯用。

实现中的一个小弱点是缺乏对内存不足的检查——这是健壮代码所期望的。

struct my_struct* my_struct_new(size_t size) {
    struct my_struct *ms = malloc(sizeof *ms)
    if (ms) {
      ms->size = size;
      ms->memory = malloc(size * sizeof *ms->memory);
      if (ms->memory == NULL) {
        free(ms);
        ms = NULL;
      }
    }
    return ms;
}

还研究Flexible array member

struct my_struct_fma {
    size_t size;
    char memory[];
}

struct my_struct_fma *my_struct_new_fma(size_t size) {
    struct my_struct_fma *ms = malloc(sizeof *ms + sizeof *ms->memory * size);
    if (ms) {
      ms->size = size;
      }
    }
    return ms;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。