You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,会导致未定义行为,需要先计算密文的实际字节长度(你的密文是十六进制字符串,字节长度为字符串长度的一半)。

整体修复建议

  1. 统一指针类型:将main中的char *key、char *iv、char *Ciphertext改为unsigned char *,与decrypt参数类型保持一致;
  2. 按上述方式解决for循环问题;
  3. 补充handleErrors函数的声明与实现;
  4. 编译时添加-lcrypto -std=c99参数;
  5. 初始化plaintext_len为密文的实际字节长度。

内容的提问来源于stack exchange,提问作者jon doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:50:25