[面试题]如何实现对齐内存分配

题目

在面试时被问到如何实现对齐内存分配,当时是懵了,没想到响应的答案,到了出来的时候,才猛然发现,原来是底层的指针操作的问题,特此记录一下。

代码

#include <stdio.h>
#include <stdlib.h>

void* alignAlloc(size_t aligned, int sz)
{
    assert((aligned &(aligned-1)) == 0);

    void* data = malloc(sz + sizeof(void *) + aligned);  // 这里先分配比原sz大一点的空间
    if (!data) return NULL;

    void ** tmp = (void **)data + 1;  //跳过留存原地址的一个指针空间
    void **ret = (void **) (((size_t)tmp + aligned - 1) & (aligned-1));  //这里实际上是对aligned进行取余得到对齐的地址

    ret[-1] = data;
    return ret; 
}

void free(void* p)
{
    if (p){
        free(((void **)p)[-1]);
    }
}
原文地址:https://www.cnblogs.com/wildkid1024/p/13772912.html