Mitgliederzugriff innerhalb einer falsch ausgerichteten Adresse mit verknüpfter Liste

Lesezeit: 6 Minuten

Benutzer-Avatar
Raffael Sauer

Also arbeite ich daran Problem Nummer 2 von Leetcode (Im Grunde haben Sie 2 Zahlen in einer Liste umgekehrt und müssen sie summieren und die Antwort auch in einer umgekehrten Liste zurückgeben). Allerdings bekomme ich immer wieder diesen lästigen Fehler: “Laufzeitfehler: Mitgliedszugriff innerhalb der falsch ausgerichteten Adresse 0x000000000031 für den Typ ‘struct ListNode’, der eine 8-Byte-Ausrichtung erfordert”. Ich führe es auf meinem Computer aus und es funktioniert gut und liefert die erwarteten Ergebnisse. Mein Code:

/*Definition of the list:
struct ListNode {
         int val;
         struct ListNode* next;
    };*/

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* answer = malloc(sizeof(struct ListNode));
    answer->next = NULL;
    answer->val = 0;
    int auxInt = 0;
    struct ListNode* auxVar = answer;

    while(l1 != NULL || l2 != NULL) {
        if(!l1) {
            auxInt = answer->val;
            answer->val = (auxInt + l2->val) % 10;
            if(((l2->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l2->val + auxInt) /10;
            }
            l2 = l2->next;
        }
        else if(!l2) {
            auxInt = answer->val;
            answer->val = (auxInt + l1->val) % 10;
            if(((l1->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l1->val + auxInt) /10;
            }
            l1 = l1->next;
        } else {
            auxInt = answer->val;
            answer->val = (l1->val + l2->val + auxInt) % 10;
            if(((l1->val + l2->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l1->val + l2->val + auxInt) /10;
            }
            l1 = l1->next;
            l2 = l2->next;
        }
        if(l1 == NULL && l2 == NULL)
            break;
        else
        {
            if(!answer->next)
                answer->next = malloc(sizeof(struct ListNode));
            answer = answer->next;
            answer->next = NULL;
        }
    }
    return auxVar;
}

Irgendwelche Gedanken darüber, was dieses Problem verursachen könnte? Vielen Dank für Ihre Zeit.

Bearbeiten: Hier ist ein überprüfbares Beispiel mit den Zahlen, die zum Absturz führen:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

/*typedef struct InvertedList {
    int val;
    struct InvertedList *next;
    struct InvertedList *previous;
}Lista;*/

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* answer = malloc(sizeof(struct ListNode));
    answer->next = NULL;
    answer->val = 0;
    int auxInt = 0;
    struct ListNode* auxVar = answer;

    while(l1 != NULL || l2 != NULL) {
        if(!l1) {
            auxInt = answer->val;
            answer->val = (auxInt + l2->val) % 10;
            if(((l2->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l2->val + auxInt) /10;
            }
            l2 = l2->next;
        }
        else if(!l2) {
            auxInt = answer->val;
            answer->val = (auxInt + l1->val) % 10;
            if(((l1->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l1->val + auxInt) /10;
            }
            l1 = l1->next;
        } else {
            auxInt = answer->val;
            answer->val = (l1->val + l2->val + auxInt) % 10;
            if(((l1->val + l2->val + auxInt) / 10) != 0) {
                answer->next = malloc(sizeof(struct ListNode));
                answer->next->val = (l1->val + l2->val + auxInt) /10;
            }
            l1 = l1->next;
            l2 = l2->next;
        }
        if(l1 == NULL && l2 == NULL)
            break;
        else
        {
            if(!answer->next)
                answer->next = malloc(sizeof(struct ListNode));
            answer = answer->next;
        }
    }
    return auxVar;
}

void adicionaLista(struct ListNode* ptrLista, char *array, int size) {
    struct ListNode *auxNode = ptrLista;
    for(int i = 0; i < size; i++) {
        ptrLista->val = array[i];
        if(i + 1 != size) {
            ptrLista->next = malloc(sizeof(struct ListNode));
            ptrLista = ptrLista->next;
        }
    }
    ptrLista = auxNode;
    printf("\n");
}
void printAnswer(struct ListNode *ptrAnswer) {
    for(; ptrAnswer != NULL; ptrAnswer = ptrAnswer->next)
        printf("%d ", ptrAnswer->val);
}

int main()
{
    struct ListNode *l1 = malloc(sizeof(struct ListNode));
    struct ListNode *l2 = malloc(sizeof(struct ListNode));
    char lista[9] = {4,5,2,2,9,3,8,9,2};
    char lista2[9] = {0,7,6,1,6,5,0,6,7};
    adicionaLista(l1, lista, 9);
    adicionaLista(l2, lista2, 9);
    struct ListNode *answer = addTwoNumbers(l1, l2);
    printAnswer(answer);
    return 0;
} 

  • Sie haben kein MCVE (minimal reproduzierbares Beispiel) bereitgestellt. Sie haben keine geeigneten Beispieldaten bereitgestellt. Sie haben nicht gezeigt, wie die Listen aufgebaut sind. Sie haben uns kein Druckverfahren mitgeteilt. Sie müssen ein MCVE und Beispieldaten bereitstellen – von dem Typ, der Ihren Code zum Absturz bringt. (Abstürze auf dem Computer eines anderen können in Ordnung sein, wenn Sie die Daten kennen, die abstürzen.) Haben Sie verwendet Valgrind zu analysieren, was falsch läuft?

    – Jonathan Leffler

    23. Juli 2017 um 14:58 Uhr

  • Verwenden Sie einen Debugger. Schauen Sie genau hin, was danach passiert answer->next = malloc(...)

    – Raymond Chen

    23. Juli 2017 um 15:03 Uhr

  • @JonathanLeffler Entschuldigung, das war nicht sehr nachdenklich von meiner Seite. Ich habe die Frage mit Ihren Anfragen bearbeitet.

    – Raffael Sauer

    23. Juli 2017 um 15:46 Uhr

  • Ich würde empfehlen, eine Funktion zu verwenden, um neue Knoten zu erstellen. Es gibt definitiv Stellen, an denen Sie den Knoten nicht vollständig initialisieren, insbesondere den nächsten Zeiger, und das führt dazu, dass Ihr Code für mich abstürzt.

    – Ninja im Ruhestand

    23. Juli 2017 um 20:01 Uhr

  • bei adicionaLista Das Letzte next ist nicht NULL initialisiert. Es gibt überall das gleiche Problem.

    – BLUEPIXY

    23. Juli 2017 um 22:11 Uhr

Benutzer-Avatar
BLUEPIXY

Das Hauptproblem ist das next im letzten Element ist nicht gesetzt NULL.
Nebenprobleme sind…

  1. Es wird erwartet, dass keine leere Liste erstellt wird, dh eine Situation, in der nutzlose Knoten erstellt werden.
  2. Es gibt viele Duplikate im Code. Das macht es schwierig, den Code zu ändern.
  3. printf("\n"); sollten nicht in zusätzliche Funktionen von Daten aufgenommen werden. Es sollte in Ausgabefunktionen verwendet werden.

fester und reduzierter Code

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) {
    struct ListNode anchor  = { .next = NULL }, *curr = &anchor;
    int carry = 0;
    while(l1 != NULL || l2 != NULL || carry) {
        int val1 = 0, val2 = 0;
        if(l1) {
            val1 = l1->val;
            l1 = l1->next;
        }
        if(l2) {
            val2 = l2->val;
            l2 = l2->next;
        }
        int answer = val1 + val2 + carry;
        carry = answer > 9;//val1 and val2 are one digit.
        curr = curr->next = malloc(sizeof(struct ListNode));
        curr->val = answer % 10;
        curr->next = NULL;
    }
    return anchor.next;
}

struct ListNode *makeListFromChars(const char *array, int size) {
    struct ListNode anchor  = { .next = NULL }, *curr = &anchor;

    for(int i = 0; i < size; i++) {
        curr = curr->next = malloc(sizeof(struct ListNode));//Creating lists and adding data is a separate function.
        curr->val = array[i];
        curr->next = NULL;
    }
    return anchor.next;
}

void printList(struct ListNode *p) {
    for(; p; p = p->next)
        printf("%d ", p->val);
    printf("\n");
}

int main(void){
    char lista1[9] = {4,5,2,2,9,3,8,9,2};
    char lista2[9] = {0,7,6,1,6,5,0,6,7};
    struct ListNode *l1 = makeListFromChars(lista1, 9);
    struct ListNode *l2 = makeListFromChars(lista2, 9);

    printList(l1);
    printList(l2);

    struct ListNode *answer = addTwoNumbers(l1, l2);
    printList(answer);
    //freeList(l1);freeList(l2);freeList(answer);
    return 0;
} 

  • Ich hatte das gleiche Problem, aber mit Ihrer Hilfe fand ich das Problem und wurde akzeptiert. Hier ist mein Arbeitscode.

    – Ezis Durdyyev

    2. Februar 2018 um 15:34 Uhr

  • Warum machen curr = curr->next = ... wenn Sie sofort zuweisen NULL zu curr->next?

    Benutzer4945014

    7. August 2021 um 16:09 Uhr

1158300cookie-checkMitgliederzugriff innerhalb einer falsch ausgerichteten Adresse mit verknüpfter Liste

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy