c – 编译器错误:无效转换从int *到unsigned int * [-fpermissi
我今天遇到了最奇怪的问题.我在线工作的例子,我没有意外,它没有用(他们几乎从来没有).我自己去修理它,但我似乎陷入了这个错误:
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,如果它 有趣的是,我认为& 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 Messagen"; char msg2[] = "Hello Worldn"; // Validate Argument Count if(argc != 2) { printf("Usage: %s digestnamen",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 %sn",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_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实际上从未实际创建过. 解决方法
这不好笑”;这是错的. 应用于类型为T的对象的address-of运算符为您提供了类型为T *的指针. 期. 无论T是无符号还是有符号类型都没有进入它,并且与涉及计算机是否可能具有负地址的哲学辩论无关.事实上,指针通常都是签名的,因为如果不是这样,当你试图取消两个地址之间的差异,或者在地址空间中向后走时,你很快就会陷入困境. 但这与在代码中使用unsigned一词无关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |