C:指向malloc的堆位置的指针加4

时间:2019-03-11 07:43:20

标签: c malloc

我正在尝试实现一个新的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)。

2 个答案:

答案 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