tipos - Creando el propio malloc para una tarea. Obteniendo un error de segmentación
segmentacion de mercado ejemplo practico (1)
Parece que estás asignando valores a la cabeza. la cabeza no ha sido asignada.
cambio:
Node* head;
Node* tail;
a:
Node head;
Node tail;
Y al acceder a un miembro del puntero a una struct use ->
. Tales como head->size
Y cuando se accede a un miembro de una struct use .
Tal como head.size
.
Hice algunos cambios en su código y ahora el programa al menos puede asignar el y usar la primera person
. Sin embargo, las asignaciones posteriores de tipo person
fallan. Sospecho que quizás void *my_bestfit_malloc(int size)
tiene algunos problemas de lógica / puntero ....
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//the structure of the node in the linked list
typedef struct Node{
int size;
int status;
struct Node* next;
struct Node* previous;
}Node;
int* HEAP_START = 0;
int* HEAP_END = 0;
struct Node head;
struct Node tail;
int first = 0;
//printf("here1/n");
void *my_bestfit_malloc(int size)
{
Node* newNode = NULL;
printf("here2/n");
if(first == 0)
{
HEAP_START = (int*)sbrk(0);
newNode = sbrk(size + sizeof(Node));
HEAP_END = (int*)sbrk(0);
head.next = &tail; //segmentation error happens here
printf("here3/n");
tail.previous = &head;
newNode->size = size;
newNode->status = 1;
first++;
}
else
{
Node* currNode = head.next;
printf("here4/n");
while( currNode != &tail)
{
if(currNode->size == size)
{
newNode = currNode;
currNode->previous->next = currNode->next;
currNode->next->previous = currNode->previous;
newNode->size = size;
newNode->status = 1;
printf("here5/n");
break;
}
else
{
currNode = currNode->next;
printf("here6/n");
}
}
if(currNode->next == &tail)
{
newNode = sbrk(size + sizeof(Node));
HEAP_END = (int*)sbrk(0);
newNode->size = size;
newNode->status = 1;
printf("here7/n");
}
}
return newNode + sizeof(Node);
}
int main()
{
typedef struct person{
int age;
char sex;
}person;
printf("main1/n");
person* dave = (person*)my_bestfit_malloc(sizeof(person));
printf("main2/n");
person* vicki = (person*)my_bestfit_malloc(sizeof(person));
printf("main3");
person* alex = (person*)my_bestfit_malloc(sizeof(person));
dave->age = 26;
dave->sex = ''M'';
//vicki->age = 24;
//vicki->sex = ''F'';
//alex->age = 19;
//alex->sex = ''F'';
printf("Dave:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
//printf("Vicki:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
//printf("Alex:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
}
Al ejecutar el código ahora, al menos da el siguiente resultado:
jrn@VirtualBox-mint17 ~ $ ./a.out
main1
here2
here3
main2
here2
here4
main3here2
here4
Dave:
Age: 26
Sex: M
La falla de segmentación ocurre en el punto con el comentario. Creo que tiene que ver con el hecho de que no estoy inicializando los Nodos de cabeza y cola. Intenté inicializar también a NULL y eso no funcionó. Lamentablemente, realmente no sé cómo inicializarlos sin usar malloc. Cualquier ayuda sería genial. Gracias.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//the structure of the node in the linked list
typedef struct Node{
int size;
int status;
struct Node* next;
struct Node* previous;
}Node;
int* HEAP_START = 0;
int* HEAP_END = 0;
Node* head;
Node* tail;
int first = 0;
//printf("here1/n");
void *my_bestfit_malloc(int size)
{
Node* newNode = NULL;
printf("here2/n");
if(first == 0)
{
HEAP_START = (int*)sbrk(0);
newNode = sbrk(size + sizeof(Node));
HEAP_END = (int*)sbrk(0);
head->next = tail; //segmentation error happens here
printf("here3/n");
tail->previous = head;
newNode->size = size;
newNode->status = 1;
first++;
}
else
{
Node* currNode = head->next;
printf("here4/n");
while(currNode->next != tail)
{
if(currNode->size == size)
{
newNode = currNode;
currNode->previous->next = currNode->next;
currNode->next->previous = currNode->previous;
newNode->size = size;
newNode->status = 1;
printf("here5/n");
break;
}
else
{
currNode = currNode->next;
printf("here6/n");
}
}
if(currNode->next == tail)
{
newNode = sbrk(size + sizeof(Node));
HEAP_END = (int*)sbrk(0);
newNode->size = size;
newNode->status = 1;
printf("here7/n");
}
}
return newNode + sizeof(Node);
}
int main()
{
typedef struct person{
int age;
char sex;
}person;
printf("main1/n");
person* dave = (person*)my_bestfit_malloc(sizeof(person));
printf("main2/n");
person* vicki = (person*)my_bestfit_malloc(sizeof(person));
printf("main3");
person* alex = (person*)my_bestfit_malloc(sizeof(person));
dave->age = 26;
dave->sex = ''M'';
vicki->age = 24;
vicki->sex = ''F'';
alex->age = 19;
alex->sex = ''F'';
printf("Dave:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
printf("Vicki:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
printf("Alex:/n/tAge: %d/n/tSex: %c/n", dave->age, dave->sex);
}
Así que traté de cambiar mi cabeza y cola de Node * a: Cabeza de nodo; Cola del nodo; en su lugar, pero recibió estos errores:
mymalloc.c: In function ‘my_bestfit_malloc’:
mymalloc.c:38: error: invalid type argument of ‘->’ (have ‘Node’)
mymalloc.c:40: error: invalid type argument of ‘->’ (have ‘Node’)
mymalloc.c:47: error: invalid type argument of ‘->’ (have ‘Node’)
mymalloc.c:49: error: invalid operands to binary != (have ‘struct Node *’ and ‘Node’)
mymalloc.c:67: error: invalid operands to binary == (have ‘struct Node *’ and ‘Node’)
Entiendo los primeros tres, necesito usar head.next = tail; en cambio, pero no entiendo los dos últimos.
Edición final: Entendido si está resuelto. Los punteros para cabeza y cola deben ser estructuras de Nodo reales en lugar de punteros struct. También necesitaba devolver un puntero de vacío en lugar de un Nodo.