2012-05-20 3 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); 

Любое понимание, почему это происходит? Я ничего не делаю, это исправление.

Необработанное исключение в 0x776e7094 в тесте application.exe: 0xC0000005:

То есть точная ошибка.

Нарушение прав доступа.

Не имеют доступа к нарушениям, когда указатель указывает на недоступный адрес, например, если он был освобожден или вышел из сферы действия, или null и т. Д.? Если да, то почему он здесь поднимается? Массив символов прямо здесь.

+0

Какие значения NC_KEY_MAX_LENGTH и NC_PRIV_KEY_LENGTH? –

ответ

1

Ваш массив объявлен длиной NC_KEY_MAX_LENGTH, что означает, что вы можете получить доступ к его местоположению от apkey[0] thr 'apkey[NC_KEY_MAX_LENGTH-1].

, если вы посмотрите на функцию

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

вы обращаетесь за ваш размер массива ..

+0

+1. Вероятно, вы могли бы исправить это, используя цикл while, а не цикл 'do'-'while'. –

+0

Прохладный, что исправил его. Кроме того, я кормил его строкой 'unsigned char *', которая, по-видимому, ей не понравилась ... – Qix

Смежные вопросы