C语言分配4k对齐内存

分配内存,按4k字节对齐。亦即分配的内存指针指向的地址,低12位(二进制)均为0。

 

假设要分配size字节内存。基本思路就是先分配size+4k-1字节的内存,然后在起始的4k字节里,找到4k对齐的那个地址(即低12位为0),作为对齐内存首地址,返回。

当然为了避免内存泄漏,要保留初始分配的内存地址,在使用完内存后,需要free掉分配的所有内存。

 

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

#define uintptr_t unsigned long long int
#define ALIGNED_BASE 0x1000

static void* alloc_4k_aligned_mem(int size, void** ppOut)
{
    *ppOut = (void*) calloc(1, size + ALIGNED_BASE - 1);
    printf("ppOut: %p\n", *ppOut);
    if(!ppOut)
    {
        return NULL;
    }

    void* pAligned = (void*)((uintptr_t)(*ppOut+ ALIGNED_BASE - 1) & ~(ALIGNED_BASE - 1));
    printf("pAligned: %p\n", pAligned);
    return pAligned;
}

int main ()
{
    const char* CHARS = "0123456789ABCDEF";
    int size = 17;
    void* orig;
    char* p = (char*) alloc_4k_aligned_mem(size, &orig);

    if(!p)
    {
        printf("return -1.");
        return -1;
    }

    for(int i=0; i<size - 1; i++){
        *(p+i) = CHARS[i % 16];
    }
    
    printf("%s\n", p);

    free(orig);

    return 0;
}

 

输出截图:

 

posted on 2019-08-08 19:23  areful  阅读(2797)  评论(0编辑  收藏  举报

导航