【问题标题】:Access violation writing location访问违规写入位置
【发布时间】:2009-12-02 16:37:29
【问题描述】:

我有以下代码:

#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);

任何有关如何解决此问题的建议都会很棒。

【问题讨论】:

  • 键是一个指针,你想给它分配一些内存吗?如果是这样 key = new char[100]; //一些缓冲区

标签: c++ openssl rsa


【解决方案1】:

由于key 没有指向任何东西,并且您使用数组表示法下标引用了它,这就是源代码。 key 如何获取值。您正在覆盖或践踏其他一些不属于您的内存块,因此 Windows 捕获了“访问冲突”。仔细检查您的代码并确保变量已被 malloc 或 new。

作为旁注,最好这样声明它

无符号字符 *key = NULL;

这样,如果您尝试访问 key 而不使用 malloc'd/new'd,您将收到内存异常错误(很容易确定这一点)。考虑一下它使调试变得更加容易。

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

    【解决方案2】:

    您有访问冲突,因为您尝试使用空终止符分配密钥,但您没有为密钥分配任何内存。我们需要知道您想要完成什么。

    【讨论】:

      【解决方案3】:

      您没有为键分配任何内存 - 第一次使用它是在您尝试将元素设置为 0 时。

      【讨论】:

        【解决方案4】:

        在这种情况下分配适量内存的正确解决方案是:

        key = malloc(BN_num_bytes(rsa->n));
        BN_bn2bin(rsa->n, key);
        

        【讨论】:

        • 他的标签说C++,不要在C++中使用malloc。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 2020-09-04
        • 2012-12-05
        • 2013-04-15
        相关资源
        最近更新 更多