C语言编译报错:函数参数类型不匹配与for循环C99模式限制问题
代码错误分析与解决
一、类型相关警告的原因
你已经正确声明了decrypt函数,但警告源于指针符号类型不匹配:
decrypt的参数要求是unsigned char *,但你在main中传入的Ciphertext、key、iv都是char *类型。C语言中char与unsigned char是不同类型,编译器会对这种不匹配触发警告。- 此外,
readWord返回unsigned char *,你却赋值给char *key,这也导致了第30行的类型警告。
二、for循环写法的问题
for(int i = 0; i < len; ++i)这种在循环头内声明变量的写法,仅在C99及后续标准中被允许,而你的编译器默认采用C89标准编译,因此触发错误。
解决方式二选一:
- 编译时添加参数
-std=c99或-std=gnu99,切换到C99模式; - 将变量
i的声明移到循环外:int i; for(i = 0; i < len; ++i) { sprintf(checker2 + (i*2),"%02x",plainText[i]); }
三、其他错误/警告的解释与修复
1. handleErrors隐式声明警告
你调用了handleErrors()但未声明其函数原型,也未实现该函数。编译器无法识别函数的参数与返回值类型,因此触发警告。
修复:添加函数原型void handleErrors(void);,并实现该函数(例如基于OpenSSL的错误打印逻辑):
void handleErrors(void) { ERR_print_errors_fp(stderr); abort(); }
2. EVP_CIPHER_CTX *ctx无法解析
该问题是因为未正确链接OpenSSL库,或编译器找不到EVP_CIPHER_CTX的定义。
修复:编译时添加-lcrypto参数,确保链接OpenSSL加密库。
3. EVP_DecryptUpdate/EVP_DecryptFinal_ex指针类型警告
本质还是类型不匹配问题:你传入的部分参数类型与OpenSSL函数期望的unsigned char *不匹配。同时注意,代码中plaintext_len变量未初始化就传入EVP_DecryptUpdate,会导致未定义行为,需要先计算密文的实际字节长度(你的密文是十六进制字符串,字节长度为字符串长度的一半)。
整体修复建议
- 统一指针类型:将
main中的char *key、char *iv、char *Ciphertext改为unsigned char *,与decrypt参数类型保持一致; - 按上述方式解决for循环问题;
- 补充
handleErrors函数的声明与实现; - 编译时添加
-lcrypto -std=c99参数; - 初始化
plaintext_len为密文的实际字节长度。
内容的提问来源于stack exchange,提问作者jon doe
相关产品推荐
相关产品推荐

