Segfault Cannot access memory at address
Bekam ich einen "segmentation fault" auf der code-Abschnitt unten: (in Bezug auf diese segfault , ich Frage 2 Frage in einem Thema)
req_cw(ECM_REQUEST *er, int32_t flag, int32_t reader_types){
LL_NODE *ptr;
for (ptr = er->matching_rdr->initial ; ptr ; ptr = ptr->nxt) {
if (ptr == er->fail)
break;
rdr = (struct s_reader*)ptr->obj;
we_equest(rdr->fd, er);
}
}
Wie Sie sehen, auch mit der control-Struktur mit if(ptr->obj && ptr)
um sicher zu sein ptr
(oder ptr->obj
nicht null
Zeiger), aber es nicht es und nach segmentation fault, wenn ich versuchte, drucken Sie den Wert ptr->obj
mit:
print ptr->obj gdb sagt :
(gdb) print ptr $1 = (LL_NODE *) 0x149
(gdb) x 0x149
0x149: Cannot access memory at address 0x149
Meine Frage ist: Wie kann ich verhindern, dass dieses "segmentation fault", warum dieses " segmentation fault passiert und wie kann ich es beheben?
- Bezüglich dieser segfault , wenn Sie mit gdb , die ich überprüft hatte-frame 1 (frame vor, wenn segfault passiert ist) , habe ich herausgefunden, dass
er->cw ist "\000 <repeats 15 times>"
meine Frage ist, wie könnte ich kontrollieren, wenn er->cw
nicht gleich von "'\000' <repeats 15 times"
?
Ich dies Tat, weiß ich, dass es nicht richtig ist (und ich etwas übersehen) , deshalb Frage ich hier
if (er->cw)
req_cw(er , ...)
Ist das problem mit dem hinzufügen von if(er->cw)
. Ich denke cw
ist Zeichen und ich sollte das Verhalten nicht, wie integer , aber ich weiß nicht, wie zu überprüfen, um nicht gleich null sein?, Ich meine , auch mit dieser Linie wieder wenn ich mit gdb , noch er->cw
mit dem Wert "'\000' " ist vorbei , so wie mit if-block konnte ich überprüfen, wenn er->cw
ist nicht gleich '\000' " ?
Vielen Dank im Voraus.
0x149
ist definitiv einen ungültigen Zeiger... das problem ist, in einem anderen Teil des Codes, den Sie noch nicht zeigte unswie mit gdb konnte ich herausfinden, ox149 warum ist ungültig , ich meine, wie mit gdb konnte ich überprüfen, die ungültigen Zeiger u erwähnt? btw , mein zweiter Teil Frage ist, wie Sie überprüfen, wenn cw ist nicht gleich "'\000' wiederholen 15-mal" mit der wenn funtion ? btw , da u sagte, das problem ist in einem anderen Teil des Codes , welcher Teil u gemeint? (wenn u sagte den Namen der Funktion , die ich geben werde, dass der Quellcode auch . Dank
zumindest mein zweiter Teil der Frage muse einfach zu viele Menschen in diesem forum! nicht , so nach 50-review immer noch keine Antworten auf den zweiten Teil , also, wenn ich überprüfen mit if(strlen(er->cw) != 0) ist diese Kontrolle, um er->cw gültig für verhindern, dass der Wert '\000 wiederholen Sie 15-mal ?
InformationsquelleAutor nima tajfar | 2013-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
As you see, even with the control structure with if(ptr->obj || ptr) to be sure ptr (or ptr->null won't be null pointer)
Nein... , eigentlich nicht dafür, dass weder NULL sein wird, setzt Sie sich für einen seg-fault. Die
||
bewerten beide Seiten, bevor es beendet, und Sie die Logik, nach hinten sowieso. Sie wollte&&
und Sie brauchen, um zu spiegeln, oder es wird der Respekt vor dem, was sein könnte eineNULL
Zeiger:Ich habe nie gesehen, eine Adresse
0x149
gültig sein, welche hardware-Plattform Sie sind?Dies ist nicht klar, konnten Sie zeigen die Struktur für
er
? Sagen Sie, dasser->cw
ist einchar *
geben, und er wird"\000 <repeats 15 times>"
?bezüglich if(ptr && ptr->obj) ich wusste , ich sagte, das ist ein Schreibfehler, verursacht durch das editieren des Moderators!
ja, und Sie sagte auch (im anderen Kommentar), dass Sie versucht
(!ptr && !ptr->obj)
was falsch ist. Ich sehen oder Bearbeiten, dass Sie es ernst meinte, ohne die!
s. Der SH4 ist 32-bit-hardware, also warum nicht Sie versuchen, Zugriff auf die Adresse mit einem 32-bit-Adresse? C nicht geht, zu wissen, in welche Richtung pad, wenn das Ihre intention war. Dacw
ist ein array von Zeichen, dann müssen Sie vergleichen char durch char oder mit einem str-Funktion, die anfängliche\000
ist ein escape-char, und Sie sollten sehen, dasscw[0] == 0
InformationsquelleAutor Mike
Das problem ist die Reihenfolge, die Sie tun, die tests, wenn Sie erstellt die
ptr->obj
zuerst gemacht, so dass, wennptr
null ist, sind Sie Zugriff auf ungültigen Speicher zu bekommen derobj
Mitglied.Die Reihenfolge der tests
if (ptr || ptr->obj)
ABER, die noch nicht Recht... Ihr
OR
Logik falsch ist auch der code sein soll...Es hängt davon ab, was er->cw ist... wenn es ein text-string, dann prüfen
if (er->cw[0] == '\0') empty_string
ist genug, um zu testen, die für einen leeren string. Tests fürif (er->cw=="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
ist SCHLECHTE Idee.Dank Anonymouse gibt es da einen Unterschied zwischen der überprüfung, ob (er->cw[0] == '\0' oder '\000'?
Die absoluten Puristen werden sagen, ja, es ist ein Unterschied, \0 ist die NULL-Abschlusszeichen, wo als \000 ist das ascii-Zeichen 0. Aber in Wirklichkeit sind Sie die gleichen.
InformationsquelleAutor Anonymouse