У меня есть следующее назначение:
Напишите функцию на C, которая выделяет блок памяти и возвращает указатель на начало памяти при следующих условиях:
- Все адреса в блоке делятся на 32
- Выделено по крайней мере необходимое количество байтов
- Каждая ячейка в блоке инициализируется нулем
- Без глобальных вариантов, минимальная сложность
Напишите другую функцию, которая также освобождает выделенную вами память. (Вы знаете, что вышеупомянутая память была выделена первой функцией, которую вы только что написали).
Вот временное решение для отладки:
"aligned_malloc.h":
#ifndef __ALIGNED_MALLOC_H__
#define __ALIGNED_MALLOC_H__
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ALIGNMENT 16
#if ALIGNMENT > 255
#error "This 'void *aligned_malloc(size_t size)' function can only handle alignment < 256"
#endif
#if ALIGNMENT < 0
#error "This 'void *aligned_malloc(size_t size)' function can only handle a non negative alignment"
#endif
void* aligned_malloc(size_t size);
void aligned_free(void *aligned_p);
#endif /* __ALIGNED_MALLOC_H__ */
"alligned_malloc.c":
#include "aligned_malloc.h"
#undef DEBUG
#define DEBUG 1
int main()
{
size_t size = 0;
void *memblk = NULL;
do while (size > 0 )
{
printf("\nPlease enter in bytes the memory block size you want to allocate (0 to exit): ");
scanf("%d", &size);
memblk = aligned_malloc(size);
#ifdef DEBUG
printf("%s[%d]: memblk = 0x%x\n", __FUNCTION__, __LINE__, memblk);
#endif /* DEBUG */
}
if (memblk != NULL)
aligned_free(memblk);
return 0;
}
void *aligned_malloc(size_t size)
{
int i = 0;
void* memblk = malloc(size + ALIGNMENT);
printf ("\n%ld",(long)memblk);
//offset is the start address of memblk (long=8digit) modulo the ALIGNMENT
unsigned char offset = ALIGNMENT - ((long)memblk % ALIGNMENT);
printf ("\n%d",offset);
if (memblk == NULL)
return NULL;
/* O/W: */
#ifdef DEBUG
printf("%s[%d]: memblk = 0x%x\n", __FUNCTION__, __LINE__, memblk);
#endif /* DEBUG */
for (i = offset; i < size + ALIGNMENT; i++)
{
printf("%02d: %08d\n", i, memblk+i);
memblk[i] = 0;
}
*(memblk + offset - 1) = offset;
return (void*)(memblk + offset);
}
void aligned_free(void *aligned_p)
{
unsigned char offset = (unsigned char)(*((unsigned char *)aligned_p-1));
#ifdef DEBUG
printf("%s[%d]: offset = %d\n", __FUNCTION__, __LINE__, offset);
printf("%s[%d]: aligned_p-1 = 0x%x\n", __FUNCTION__, __LINE__, (unsigned char *)aligned_p-1);
printf("%s[%d]: aligned_p-offset = 0x%x\n", __FUNCTION__, __LINE__, aligned_p-offset);
#endif /* DEBUG */
free(aligned_p-offset);
}
Теперь у меня есть несколько проблем:
- В
main()
- Я не могу понять, как использовать
calloc
вместо malloc
- Если я использую
void*
, есть ли возможность преобразовать его в 32-байтовые куски?