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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:15:08