Место записи о нарушении прав доступа

У меня есть следующий код:

#include <openssl/bn.h>
#include <openssl/rsa.h>

unsigned char* key;
RSA* rsa = RSA_new();
rsa = RSA_generate_key(1024,65537,NULL,NULL);
//init pubkey
key[BN_num_bytes(rsa->n)] = '\0';
BN_bn2bin(rsa->n, key);
printf("RSA Pub: %s\n", key);
RSA_free( rsa );
rsa = NULL;

Отладчик говорит мне, что у меня есть проблема "Место записи нарушения доступа" на линии

key[BN_num_bytes(rsa->n)] = '\0';

Если я закомментирую эту строку, проблема просто переходит к

BN_bn2bin(rsa->n, key);

любые предложения о том, как решить эту проблему, было бы здорово.

4 ответа

Решение

Поскольку key не указывает ни на что, и вы ссылаетесь на него с помощью индексации массива, то есть источника. Как ключ получает значение. Вы перезаписываете или попираете какой-то другой блок памяти, который не принадлежит вам, следовательно, "нарушение прав доступа", зафиксированное окнами. Дважды проверьте ваш код и убедитесь, что переменная была malloc'd или new'd.

Как примечание, лучше для вашего здравомыслия объявить это так

символ без знака *key = NULL;

Таким образом, если вы пытаетесь получить доступ key без malloc'd / new'd вы получите ошибку исключения памяти (которая может быть легко прибита к этому). Учтите, что это значительно облегчает отладку.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

У вас есть нарушение прав доступа, потому что вы пытаетесь назначить ключ с нулевым терминатором, но вы не выделили память для ключа. Нам нужно знать, чего вы пытаетесь достичь.

Вы не выделяете память для ключа - в первый раз он используется, когда вы пытаетесь установить элемент в 0.

Правильное решение для выделения нужного количества памяти в этом случае:

key = malloc(BN_num_bytes(rsa->n));
BN_bn2bin(rsa->n, key);
Другие вопросы по тегам