C语言用指针实现函数多值返回时报expected an identifier错误如何解决?
报错核心原因
你的代码存在两个直接触发编译错误的语法问题:
- 函数形参列表语法完全错误:你在
level函数的参数列表里重复定义了参数,先无类型声明了lev, ran1, ran2三个参数,又重复定义了同名的int* ran1, int* ran2参数,C语言不允许同一参数列表内出现重名参数,也不允许无类型的参数声明(遵循C99及以后标准的情况下),所以编译器会报括号前缺少标识符的错误。 - 指针用法错误:即使修正参数列表,你直接给指针变量
ran1/ran2本身赋值的写法,也无法把随机数传回函数外部,正确写法是要解引用指针,给指针指向的内存空间赋值。
还有两个隐含逻辑问题:
srand(time(0))放在函数内部的话,每次调用函数都会重新初始化随机数种子,如果短时间内多次调用函数,会得到完全相同的随机数,正确写法是把srand放到main函数中,程序启动时只执行一次。- 你声明函数返回值为
int类型,但函数体内没有任何return语句,编译时会触发返回值缺失的警告。
修复方案
分两种场景选择:
场景1:用全局变量存储随机数结果
既然你已经定义了ran1、ran2为全局变量,就不需要再把它们作为参数传入函数,直接在函数内给全局变量赋值即可:
// 提前定义全局变量 int ran1, ran2; // 函数只需要传难度参数,返回值可以改成void,不需要返回int void level(char lev){ if(lev == 'l'){ ran1 = (rand()%10 + 1); ran2 = (rand()%10 + 1); } else if(lev == 'm'){ ran1 = (rand()%50 + 11); ran2 = (rand()%50 + 11); } else if(lev == 'h'){ ran1 = (rand()%100 + 51); ran2 = (rand()%100 + 51); } } // main函数调用示例 int main(){ srand(time(0)); // 随机数种子只初始化一次 level('l'); printf("随机数1:%d,随机数2:%d", ran1, ran2); return 0; }
场景2:不用全局变量,用指针返回两个随机数
如果你不想用全局变量,就用指针参数带回结果,注意参数列表不要重名,赋值时要解引用:
// 函数参数:第一个是难度,后两个是int类型指针,用来存结果 void level(char lev, int* ran1, int* ran2){ if(lev == 'l'){ *ran1 = (rand()%10 + 1); // 解引用指针,给指向的变量赋值 *ran2 = (rand()%10 + 1); } else if(lev == 'm'){ *ran1 = (rand()%50 + 11); *ran2 = (rand()%50 + 11); } else if(lev == 'h'){ *ran1 = (rand()%100 + 51); *ran2 = (rand()%100 + 51); } } // main函数调用示例 int main(){ srand(time(0)); int a, b; level('m', &a, &b); // 传入变量的地址作为指针参数 printf("随机数1:%d,随机数2:%d", a, b); return 0; }
内容的提问来源于stack exchange,提问作者Sen ZmaKi
相关产品推荐
相关产品推荐

