簡體   English   中英

編譯器錯誤:無效轉換從int *到unsigned int * [-fpermissive]

[英]Compiler Error: Invalid Conversion from int* to 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* type,這樣就可以了,因為它需要一個地址(或至少說明我工作的例子)正在使用它)

有趣的是,我認為&運算符返回了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實際上從未實際創建過。

因為返回int *沒有意義,因為計算機的內存中沒有負地址。

您誤解了類型名稱的含義。

unsigned int*是指向unsigned int的指針。 unsigned不引用指針值。

因此解決方案是將int更改為unsigned int。

有趣的是,我認為&運算符返回了unsigned int *,因為返回int *沒有意義,因為計算機的內存中沒有負地址

它不是內存地址編號(指針的基礎值)的簽名,它是存儲在內存地址中的數據類型的簽名,在本例中是整數。

根據規范將md_length更改為unsigned int ,它應該沒問題。

有趣的是,我認為&運算符返回了unsigned int *,因為返回int *沒有意義,因為計算機的內存中沒有負地址。

這不好笑”; 這是錯的。

應用於類型為T的對象的address-of運算符為您提供了類型為T*的指針。

期。

無論T是無符號還是有符號類型都沒有進入它,並且與涉及計算機是否可能具有負地址的哲學辯論無關。 事實上, 指針一般是因為簽署,如果他們沒有,你很快就會被卡住,當你嘗試走差異化兩個地址之間,或在地址空間向后走。

但這與在代碼中使用unsigned一詞無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM