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 Letztenext
ist nichtNULL
initialisiert. Es gibt überall das gleiche Problem.– BLUEPIXY
23. Juli 2017 um 22:11 Uhr