2012-05-20 6 views
0

좋아,이 하나 알아낼 수 없습니다. 디버거는이 예외에 대한 많은 정보를 제공하지 않습니다.액세스 위반 : 잘못된 포인터

NC_LIBEXPORT(VOID) ncKeyExpand(unsigned char* key, int initlen) 
{ 
    int abspos = initlen; 
    int curkpos = 0; 
    do 
    { 
     key[abspos] = key[curkpos]; 
     ++abspos; 
     ++curkpos; 
     if(curkpos >= initlen) 
      curkpos = 0; 

    } while (curkpos < NC_KEY_MAX_LENGTH); 
} 

그리고 액세스 위반이 여기에 두 번째 줄에 발생합니다 : 여기

은 함수가 호출되고

왜 이런 일이에 관해서는
unsigned char apkey[NC_KEY_MAX_LENGTH]; 
ncKeyExpand(&apkey[0], NC_PRIV_KEY_LENGTH); 

어떤 통찰력? 내가하는 일은 그것을 고치기위한 것이 아니다. 가 0xc0000005 : 시험의 application.exe에서 0x776e7094에서

처리되지 않은 예외 정확한 오류입니다

.

액세스 위반.

포인터가 비어 있거나 범위를 벗어나거나 null 등으로 액세스 할 수없는 주소를 가리키는 경우 액세스 위반이 발생하지 않습니까? 그렇다면 왜 여기에서 자랐습니까? char 배열은 바로 거기입니다.

+0

NC_KEY_MAX_LENGTH 및 NC_PRIV_KEY_LENGTH의 값이 무엇입니까? –

답변

1

배열의 길이는 NC_KEY_MAX_LENGTH으로 지정되어 있습니다. 즉, 배열의 위치는 apkey[0]에서 'apkey[NC_KEY_MAX_LENGTH-1]'입니다.

당신이 당신의 기능

do 
{ 
    key[abspos] = key[curkpos]; 
    ++abspos; 

당신이 당신의 배열의 크기를 초과 액세스를 보면 ..

+0

+1. 'do'-'while' 루프보다는'while' 루프를 사용하여 문제를 해결할 수 있습니다. –

+0

멋지다. 또한, 나는 그것에게'unsigned char *'문자열을 주었는데, 분명히 좋아하지 않았다. – Qix