2012-04-12 2 views
1

HeapAlloc을 포함하지 않으면 내 프로그램에서 오류가 발생합니다. 정확히 이해할 수 없습니다.0xC0000005 : 액세스 위반이 연결 작성 중

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; 

는하지만 선을 포함 할 때

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

그런 다음 프로그램을 다시 실행

이 성공적으로 실행됩니다.

정확히 그 행은 무엇입니까? 내가 이해할 수없는.

I 번째 라인 Str_Dump[iIndex] 메모리를 할당

StrLog Str_Dump[100]; 
+0

Str_Dump에 공간을 할당 했습니까? 이 코드가 완료되면이 코드에서 불분명합니다. – PeskyGnat

+0

@PeskyGnat strdump 선언은 StrLog Str_Dump [100]과 유사합니다. – hardyz009

+0

@ hardyz009 그렇습니다. 그러나'StrLog'는 포인터이므로 포인터 배열 만 있습니다. 포인터를 가리 키도록 메모리를 할당하고 포인터를 초기화해야합니다. (또는 slog에 대한 포인터 대신에'slog'의 배열을 선언 할 수 있습니다. 또한 이와 같이 typedef는'StrLog'가 포인터라는 사실을 숨기고 대부분의 경우 피해야합니다) – nos

답변

4

로 strdump 선언. HeapAllocGetProcessHeap은 WinApi 메서드이며 MSDN 웹 사이트에서 해당 설명서를 찾을 수 있습니다.

할당되지 않은 포인터 (Str_Dump[iIndex])에 액세스 중이므로 첫 번째 행이 충돌합니다.

+0

strdump를 StrLog로 선언 Str_Dump [100]; – hardyz009

+0

@ hardyz009 : 할당되지 않은 100 개의 포인터를 정의합니다. 그것들 중 첫 번째,'Str_Dump [0]'은 마지막으로'Str_Dump [99]'와 같이 할당되지 않았습니다. – MSalters

3

우리가 볼 수 있듯이 Str_Dumpslog 개체에 대한 포인터 배열입니다. 당연히, 포인터를 가리키는 객체가 slog이 아니라면 (즉, HeapAlloc 콜이하는 것) 나쁜 일이 일어날 것입니다. 이해하지 못하는 것은 무엇입니까?

관련 문제