Files
2026-10-31 11:14:30 -03:00

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;
}
}