C语言传参出现expected 'char *' but argument is type 'char **'警告
警告根因
编译器抛出expected ‘char *’ but argument is of type ‘char **’的核心原因是传参类型和函数形参类型不匹配,同时你的代码还存在未初始化野指针的隐患:
- 你在main函数中声明的
char *originCode;、char *destinationCode是未初始化的字符指针,属于野指针,本身没有指向任何可写入字符串的合法内存空间,直接往对应的内存地址写内容会触发内存访问错误。 - 你调用函数时写的
&originCode、&destinationCode取的是指针变量自身的地址,类型是二级指针char **,但readString和showF对应的形参都是一级字符指针char *,类型不匹配直接触发警告。 - 额外的参数错误:你给
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
相关产品推荐
相关产品推荐

