如何解决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;
}
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 举报,一经查实,本站将立刻删除。