![](/img/trans.png)
[英]Compiler error: invalid conversion from 'int' to '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.