Место записи о нарушении прав доступа
У меня есть следующий код:
#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);