91 lines
2.0 KiB
C
91 lines
2.0 KiB
C
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
typedef struct{
|
|
unsigned char *buffer;
|
|
size_t size;
|
|
size_t offset;
|
|
}Arena;
|
|
|
|
Arena arena_create(size_t);
|
|
void* arena_alloc(Arena *, size_t);
|
|
void arena_destroy(Arena *);
|
|
|
|
int main(void){
|
|
Arena arena = arena_create(13);
|
|
int *ptrInt1 = (int*)arena_alloc(&arena, sizeof(int));
|
|
int *ptrInt2 = (int*)arena_alloc(&arena, sizeof(int));
|
|
float *ptrFloat1 = (float*)arena_alloc(&arena, sizeof(float));
|
|
char *ptrChar1 = (char*)arena_alloc(&arena, sizeof(char));
|
|
|
|
int need = sizeof(int)*2 + sizeof(float) + sizeof(char);
|
|
|
|
printf("sizeof int: %d\n", (int)sizeof(int));
|
|
printf("sizeof float: %d\n", (int)sizeof(float));
|
|
printf("sizeof char: %d\n", (int)sizeof(char));
|
|
|
|
printf("Necesitamos: %d\n", need);
|
|
|
|
if(ptrInt1 != NULL){
|
|
*ptrInt1 = 18;
|
|
printf("Primer entero: %d\n", *ptrInt1);
|
|
}
|
|
if(ptrInt2 != NULL){
|
|
*ptrInt2 = 27;
|
|
printf("Segundo entero: %d\n", *ptrInt2);
|
|
}
|
|
if(ptrFloat1 != NULL){
|
|
*ptrFloat1 = 3.1415f;
|
|
printf("Primer flotante: %f\n", *ptrFloat1);
|
|
}
|
|
if(ptrChar1 != NULL){
|
|
*ptrChar1 = 'L';
|
|
printf("Primer char: %c\n", *ptrChar1);
|
|
}
|
|
|
|
arena_destroy(&arena);
|
|
|
|
return 0;
|
|
}
|
|
|
|
Arena arena_create( size_t bytes){
|
|
Arena new_arena = {
|
|
.buffer = NULL,
|
|
.size = bytes,
|
|
.offset = 0
|
|
};
|
|
|
|
new_arena.buffer = (unsigned char *)malloc(bytes);
|
|
|
|
if(new_arena.buffer == NULL){
|
|
perror("Error asignando memoria");
|
|
exit(1);
|
|
}
|
|
|
|
return new_arena;
|
|
|
|
}
|
|
void* arena_alloc(Arena *ref_arena, size_t bytes){
|
|
|
|
if(ref_arena->buffer == NULL){
|
|
return NULL;
|
|
}
|
|
|
|
if(ref_arena->offset + bytes > ref_arena->size){
|
|
perror("Memoria llena\n");
|
|
return NULL;
|
|
}
|
|
void* ptr_ref = ref_arena->buffer + ref_arena->offset;
|
|
ref_arena->offset += bytes;
|
|
return ptr_ref;
|
|
}
|
|
|
|
void arena_destroy(Arena *ref_arena){
|
|
if(ref_arena->buffer != NULL){
|
|
free(ref_arena->buffer);
|
|
ref_arena->buffer = NULL;
|
|
}
|
|
}
|
|
|