Ошибка компилятора: неверное преобразование из int * в unsigned int * [-fpermissive]

У меня сегодня самая странная проблема. Я работал с примером в Интернете, и, к моему удивлению, это не сработало(они почти никогда не делают), Я решил исправить это сам, но, похоже, застрял на этой ошибке:

Error: Invalid Conversion from int* to unsigned int* [-fpermissive]

Это я поняла. Я предоставляюint*Хочетunsigned int*, Тем не менее, я на самом деле не знаю,Зачем int* генерируется.

Вот фрагмент кода, бросающий проблему:

unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;

EVP_DigestFinal_ex(md_ctx, md_value, &md_length);

Третий аргумент этого вызова функции,&md_length, вызывает проблему. Просматривая документацию для вызова этой функции(Из OpenSSL, если это имеет значение), он ожидает, что аргументunsigned int* тип, который делает с тех пор, потому что он хочет адрес(или, по крайней мере, так, как это использует пример, с которым я работаю).

Самое смешное, я думал, что& оператор вернулunsigned int*, как возвращениеint* не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.

Вот пример, которому я следую, если вы хотите взглянуть:https://www.openssl.org/docs/crypto/EVP_DigestInit.html

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

Исходный код:

//* Description *//
// Title: Example
// Author: Boom Blockhead
// Example Program to Test OpenSSL

//* Libraries *//
#include <stdio.h>
#include <cstring>
#include <openssl/evp.h>

//* Namespaces *//
using namespace std;

//* Main Method *//
// Runs the Program and Interprets the Command Line
int main(int argc, char* argv[])
{
    // Initialize the Messages
    char msg1[] = "Test Message\n";
    char msg2[] = "Hello World\n";

    // Validate Argument Count
    if(argc != 2)
    {
      ,  printf("Usage: %s digestname\n", argv[0]);
        exit(1);
    }

    // Determine Message Digest by Name
    OpenSSL_add_all_digests();
    const EVP_MD* md = EVP_get_digestbyname(argv[1]);

    // Make sure a Message Digest Type was Found
    if(md == 0)
    {
        printf("Unknown Message Digest %s\n", argv[1]);
        exit(1);
    }

    // Create the Message Digest Context
    EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();

    // Setup the Message Digest Type
    EVP_DigestInit_ex(md_ctx, md, NULL);

    // Add the Messages to be Digested
    EVP_DigestUpdate(md_ctx, msg1, strlen(msg1));
    EVP_DigestUpdate(md_ctx, msg2, strlen(msg2));

    // Digest the Message
    unsigned char md_value[EVP_MAX_MD_SIZE];
    int md_length;

    EVP_DigestFinal_ex(md_ctx, md_value, &md_length); // <--- ERROR

    // Destroy the Message Digest Context
    EVP_MD_CTX_destroy(md_ctx);

    // Print the Digested Text
    printf("Digest is: ");

    for(int i = 0; i < md_length; i++)
        printf("%02x", md_value[i]);

    printf("\n");

    // Clean up the Message Digest
    EVP_cleanup();

    // Exit the Program
    exit(0);
    return 0;
}

Кроме того, положив явное приведение(unsigned int*) кажется, только усугубляет ситуацию, так как я получаю следующую ошибку:

example.cpp:(.text+0x91): undefined reference to `OpenSSl_add_all_digests`
...
example.cpp:(.text+0x1ec): undefined reference to `EVP_cleanup`

В основном, он жалуется на все функции OpenSSL.

И, наконец,(опять же, это просто, чтобы дать вам, ребята, все, что вам может понадобиться) Я не посылаю никаких забавных аргументов компилятору. Я просто использую:

gcc example.cpp -o example.out

Так как есть ошибка,example.out на самом деле никогда не создается.

Ответы на вопрос(3)

Ваш ответ на вопрос