我正在尝试实现一个新的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)。
答案 0 :(得分:2)
result += sizeof(unsigned);
应该至少给您一个警告(void *
上的指针运算会导致未定义的行为)。
unsigned *result = malloc(size + sizeof size);
result[0] = size;
return result + 1;
应该是更简单的方法。
请注意,对于所有可能的数据类型,返回的内存均未对齐。如果将此内存用于double
或其他64位数据类型,则会遇到麻烦。您应该使用8字节数据类型uint64_t
来存储大小,然后将内存块对齐。
答案 1 :(得分:-1)
例如,如果您首先将类型强制转换为char *,则可以执行void* arithmetic。然后投射回void *。为了获得更好的对齐方式,请使用64位类型的大小,例如request.data
。
uint64_t