Ошибка seg при обновлении следующего значения узла - PullRequest
0 голосов
/ 19 октября 2019

Я выполняю некоторые операции над связанным списком, которые включают в себя объединение любых узлов, имеющих freeflag == 1, но я получаю ошибку сегмента, когда обновляю значение следующего узла ... Я даже пытался установить tempptr->следующий равен нулю, и это все еще segfaults. Это не вызывает segfault, когда я удаляю строку: tempptr-> next = tempptr-> next-> next, так что я знаю, что эта строка вызывает проблемы. Был бы очень признателен за руководство .. спасибо.

size_t UpdateSize (metadataNode *node, metadataNode *nodetobeInherited, size_t metaSize){
    size_t newSize = (node->sizeContained)+ (nodetobeInherited->sizeContained) + metaSize;
    return newSize;
}


void myfree(void *freeptr, char* FILE, int LINE){
    //if you try to free a null pointer throw error.=

    if(freeptr == NULL){
        fprintf(stderr, "Error in file:%s on line: Invalid pointer. You cannot free a null pointer. %d\n", FILE, LINE );
        return;
    }

    void *lowerbound = (void*)(fakeHeap);
    void *upperbound = (void*)(fakeHeap+4096);
    if(freeptr <= upperbound && freeptr >= lowerbound){
        metadataNode *UpdatedFreeNode = freeptr; // currently points to beginning of allocated memory.
        --UpdatedFreeNode; // ptr now points to the MetaDataNode that contained info about the freed block. == UpdatedFreeNode = UpdatedFreeNode -sizeof(metadataNode);
        UpdatedFreeNode->freeFlag=1; //free()ing so set free flag to 1;
        size_t metadata = sizeof(metadataNode);
        printf("freeflag changed \n");
        metadataNode *tempptr = head;
        // merge();
        // scans through entire block to make sure there are no consecutive free blocks
        while((tempptr->next)!=NULL){
            printf("merge is beginning.\n");
             if((tempptr->freeFlag) == 1 && (tempptr->next->freeFlag) == 1){
              tempptr->sizeContained = UpdateSize(tempptr, tempptr->next, metadata);
              tempptr->next=tempptr->next->next;
             }

        tempptr=tempptr->next;
        }
    }
    //Did not give a valid ptr so return error.
    else{
        fprintf(stderr, "error in FILE: %s on line: %d: The pointer you passed was not valid.\n", FILE, LINE );
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...