#include #include #include #include #include void *aligned_alloc(size_t alignment, size_t size) { if (alignment == 0 || (alignment & (alignment - 1)) != 0) { errno = EINVAL; return NULL; } if (size % alignment != 0) { errno = EINVAL; return NULL; } if (size == 0) { return NULL; } size_t total_size = size + alignment - 1 + sizeof(void *); void *raw_ptr = malloc(total_size); if (raw_ptr == NULL) { errno = ENOMEM; return NULL; } uintptr_t raw_addr = (uintptr_t)raw_ptr; uintptr_t aligned_addr = (raw_addr + sizeof(void *) + alignment - 1) & ~(alignment - 1); void **orig_ptr_slot = (void **)(aligned_addr - sizeof(void *)); *orig_ptr_slot = raw_ptr; return (void *)aligned_addr; }