题目

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

代码

#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]);
    }
}

相关文章:

  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-18
  • 2023-02-05
  • 2021-08-27
  • 2022-12-23
相关资源
相似解决方案