2012-04-12 9 views
1

Meine Programme gibt einen Fehler, wenn ich HeapAlloc nicht einschließen. Was genau passiert, kann ich nicht verstehen.0xC0000005: Zugriffsverletzung in location schreiben

int iIndex=0; 

enum EDataType 
{ 
    kINT, 
    kFLOAT, 
    kUINT 
}; 
typedef struct logstr 
{ 
    EDataType sData_Type; 
    string sComment; 
    bool  bStatus; 
    float  fDump_Value; 
    int  iDump_Value; 
    UINT32 uDump_Value; 
}slog,*StrLog; 

Str_Dump[iIndex]->sData_Type=EDataType(0);//i get a error on this line exception0xC0000005: Access violation writing in location0X00000; 

Aber als ich zählen die Linie

Str_Dump[iIndex]=(StrLog)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(slog)); 

wieder führen Sie das Programm läuft erfolgreich.

Was genau macht diese Linie? Ich kann nicht verstehen.

Ich habe erklärt strdump als

StrLog Str_Dump[100]; 
+0

Haben Sie Platz für Str_Dump reserviert? es ist unklar von diesem Code, wenn dies getan wird – PeskyGnat

+0

@PeskyGnat strdump Deklaration ist wie StrLog Str_Dump [100]; – hardyz009

+0

@ hardyz009 Ja, aber "StrLog" ist ein Zeiger, so dass Sie nur ein Array von Zeigern haben. Sie müssen Speicher zuweisen und diese Zeiger initialisieren, damit sie auf etwas zeigen. (Oder, Sie könnten ein Array von 'Slog' anstelle von Zeigern zu einem' Slog' deklarieren. Außerdem verdeckt die Eingabe von defend die Tatsache, dass 'StrLog' ein Zeiger ist, und sollte in den meisten Fällen vermieden werden) – nos

Antwort

4

Die zweite Zeile Speicher für Str_Dump[iIndex] zuordnet. HeapAlloc und GetProcessHeap sind WinApi-Methoden. Sie finden ihre Dokumentation auf der MSDN-Website. Die erste Zeile stürzt ab, weil Sie auf einen nicht zugewiesenen Zeiger zugreifen - Str_Dump[iIndex].

+0

Ich bin strdump als StrLog Str_Dump deklarieren [100]; – hardyz009

+0

@ hardyz009: Das definiert hundert Zeiger, die alle nicht zugeordnet sind. Der erste von ihnen, "Str_Dump [0]", ist ebenso nicht zugewiesen wie der letzte, "Str_Dump [99]" – MSalters

3

Nun, basierend auf dem, was wir sehen können, sieht es aus wie Str_Dump ist ein Array von Zeigern zu slog Objekte. Natürlich, wenn Sie keine slog Objekte für diese Zeiger erstellen, auf die Sie zeigen können (was der HeapAlloc Aufruf tut), werden schlimme Dinge passieren. Was ist nicht zu verstehen?

Verwandte Themen