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?

  1. 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 uns
wie 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

Schreibe einen Kommentar