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; }
输出截图: