#include <stdio.h>
#include <stdlib.h>
void *my_malloc(int size , int align)
{
if(size <= 0 || align <= 0)
return NULL;
int real_size = size + align;
real_size += sizeof(void *);
void *ptr = malloc(real_size);
// printf("old address : %p\n" , ptr);
if(NULL == ptr)
return NULL;
void *old = ptr;
unsigned long value = (unsigned long)ptr;
if(!(value % align))
{
value += align;
}
else
{
value = (value / align + 1) * align;
}
ptr = (void *)value;
*(void **)((char *)ptr - sizeof(void *)) = old;
return ptr;
}
void my_free(void *ptr)
{
void *old = *(void **)((char *)ptr + sizeof(void *));
free(old);
}
int main()
{
void *ptr = my_malloc(1000 , 1024);
printf("first address : %p\n" , ptr);
my_free(ptr);
return 0;
}
// second edition
void *_aligned_malloc(size_t size)
{
void *tempPtr = malloc(size + 4);
char offset = 4 - ((int)tempPtr % 4);
char *alignedPtr = (char*)tempPtr + offset;
alignedPtr[-1] = offset;
return (void*)alignedPtr;
}
void _aligned_free(void *ptr)
{
char offset = ((char*)ptr)[-1];
free((char*)ptr - offset);
}