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

C语言传参出现expected 'char *' but argument is type 'char **'警告

警告根因

编译器抛出expected ‘char *’ but argument is of type ‘char **’的核心原因是传参类型和函数形参类型不匹配,同时你的代码还存在未初始化野指针的隐患:

  1. 你在main函数中声明的char *originCode;、char *destinationCode是未初始化的字符指针,属于野指针,本身没有指向任何可写入字符串的合法内存空间,直接往对应的内存地址写内容会触发内存访问错误。
  2. 你调用函数时写的&originCode、&destinationCode取的是指针变量自身的地址,类型是二级指针char **,但readString和showF对应的形参都是一级字符指针char *,类型不匹配直接触发警告。
  3. 额外的参数错误:你给readString传的maxChars值为3,fgets读取时会自动在末尾补字符串结束符\0,传3的话最多只能存2个有效字符,存不下3位长度的机场代码。
修复方案

直接按下面两点修改即可:

  • 把未初始化的字符指针改成有实际存储空间的字符数组,长度预留1位存字符串结束符:
// 替换原main函数中的char *originCode; char *destinationCode;
char originCode[4];
char destinationCode[4];
  • 调用函数时去掉取地址符&,直接传数组名(数组传参时会自动退化为指向首元素的char *指针,完全匹配形参类型),同时修正readString的长度参数:
printf("Insert origin airport code: ");
readString(originCode, 4);

printf("Insert destination airport code: ");
readString(destinationCode, 4);
printf("\n");

showF(flights, originCode, destinationCode);

补充说明:你可能是看到代码里listSize(flights, &size)这类调用加了取地址符,就误以为所有传参都要加&——这类加&的场景是因为函数需要修改传入的变量本身(比如修改int类型的size变量,就需要传int*类型的指针进去),而你的readString只需要往提前分配好的内存块写字符内容,不需要修改指针本身的指向,因此不需要传二级指针。如果要把readString设计成内部分配内存返回的形式,才需要把形参改成char**类型,和你当前的函数实现不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:30:36