una tipos servicio segmentacion producto practico mercado hacer empresa ejemplo consumo como clientes analisis c linked-list segmentation-fault malloc nodes

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.