agrego practicas
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
Executable
BIN
Binary file not shown.
Reference in New Issue
Block a user