其他分享
首页 > 其他分享> > c – 编译器错误:无效转换从int *到unsigned int * [-fpermissive]

c – 编译器错误:无效转换从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 * type,因为它需要一个地址(或者至少是我正在使用它的例子是如何使用它).

有趣的是,我认为& operator返回一个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实际上从未实际创建过.

解决方法:

Funny thing is, I thought that the & operator returned an unsigned int*, as returning an int* doesn’t make sense, seeing as computers don’t have negative addresses in their memory.

这不好笑”;这是错的.

应用于类型为T的对象的address-of运算符为您提供了类型为T *的指针.

期.

无论T是无符号还是有符号类型都没有进入它,并且与涉及计算机是否可能具有负地址的哲学辩论无关.事实上,指针通常都是签名的,因为如果不是这样,当你试图取消两个地址之间的差异,或者在地址空间中向后走时,你很快就会陷入困境.

但这与在代码中使用unsigned一词无关.

标签:unsigned-integer,c,pointers,compiler-errors,integer
来源: https://codeday.me/bug/20190728/1559211.html