c - C:指向 malloc 堆位置的指针加 4
问题描述
我正在尝试实现一个新的 malloc,它将大小存储在 malloc 区域的前面,然后返回一个指向递增位置的指针(在存储的 unsigned int 之后)。
void* malloc_new(unsigned size) {
void* result = malloc(size + sizeof(unsigned));
((unsigned*)result)[0] = size;
result += sizeof(unsigned);
return result;
}
我怀疑是否
result += sizeof(unsigned);
行是正确的(做我想要的)。假设 malloc 在堆中的原始地址是 X,unsigned 的大小是 4,我希望“结果”指针指向 X + 4,对吗?这意味着堆栈中存储“结果”指针的内存位置应包含(原始堆地址位置 + 4)。
解决方案
result += sizeof(unsigned);
应该至少给你一个警告(指针算术void *
导致未定义的行为)。
unsigned *result = malloc(size + sizeof size);
result[0] = size;
return result + 1;
应该是更简单的方法。
请注意,对于所有可能的数据类型,返回的内存并没有很好地对齐。如果您将此内存用于double
其他 64 位数据类型,则会遇到麻烦。您应该使用 8 字节数据类型uint64_t
来存储大小,然后内存块对齐良好。
推荐阅读
- laravel - 使用 foreach 和自动合并实现 maatwebsite 标题
- ios - 如何在黑色背景上实现纯黑色 UIVisualEffectView?
- python - 如何在 jupyter notebook 中修复这个内核错误
- spring-boot - Spring Boot:java.sq.SqlException:操作数应包含 1 列
- python-3.x - 获取作为回调或类似事件/中断处理程序传递的函数名称?
- xamarin - 使用 Xamarin 在我的 db Slite 中插入寄存器,错误
- node.js - 如何检索我的抽搐统计数据以显示在我的网站上?
- node.js - 如何从 LinkedIn API 一次请求多个范围?
- audio - 如何递归地计算 p 分位数?
- r - 使用 openxlsx::addStyle 显示为百分比,而无需单击 Excel 中的单元格