首页 > 解决方案 > 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)。

标签: cmalloc

解决方案


result += sizeof(unsigned);应该至少给你一个警告(指针算术void *导致未定义的行为)。

unsigned *result = malloc(size + sizeof size);
result[0] = size;
return result + 1;

应该是更简单的方法。

请注意,对于所有可能的数据类型,返回的内存并没有很好地对齐。如果您将此内存用于double其他 64 位数据类型,则会遇到麻烦。您应该使用 8 字节数据类型uint64_t来存储大小,然后内存块对齐良好。


推荐阅读