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

如何让C语言函数修改通过引用传递的数组?

问题解决:让getDoubles正确修改main中的数组

你的代码核心问题是指针类型不匹配,再加上错误的递归调用和缓冲区处理逻辑,导致数组根本没被正确写入。下面是具体问题分析和修正方案:

核心错误:指针类型不匹配

getDoubles函数的参数声明是int * doubleArr,但你传入的是double类型数组。C语言中数组名会退化为指向首元素的指针,实际传递的是double*,但函数用int*接收会引发两个致命问题:

  • 指针步长错误:int*自增每次移动4字节,而double占8字节,导致写入位置完全错位
  • 赋值类型截断:把double值写入int类型的内存,数据被破坏,原数组的double元素根本没被触及

其他问题:递归调用与无效的缓冲区处理

  • 递归调用getDoubles(doubleArr)会让函数重新从头开始循环,覆盖之前的输入,还可能导致栈溢出
  • fflush(stdin)是C标准未定义行为,不同编译器表现不一致,不能用来清空输入缓冲区

修正后的完整代码

main函数部分

#define SIZE 5

#include <stdio.h>
#include <ctype.h>

// 先声明函数
void getDoubles(double * doubleArr);

int main(void){
    double arrDoubles[SIZE] = {0};
    
    // 初始输出
    for ( int i = 0; i < SIZE; i++ ){
        printf("%lf ", arrDoubles[i]);
    }
    puts("");
    
    getDoubles(arrDoubles);

    // 输入后的输出
    for ( int i = 0; i < SIZE; i++ ){
        printf("%lf ", arrDoubles[i]);
    }
    puts("");

    return 0;
}

getDoubles函数部分

void getDoubles(double * doubleArr ){
    double userInput;
    for (int i = 0; i < SIZE; i++){
        while(1) { // 循环重试直到输入有效
            fputs("Enter a decimal number: ", stdout);
            int SCAN_RETURN = scanf("%lf", &userInput);
            
            if ( SCAN_RETURN == 1 ){
                // 输入有效,退出重试循环
                break;
            }
            else{
                puts("Invalid input. Please try again.");
                // 清空输入缓冲区的残留字符
                int c;
                while ((c = getchar()) != '\n' && c != EOF);
            }
        }
        *doubleArr = userInput;
        doubleArr++;
    }
}

修改说明

  1. 修正指针类型:把getDoubles的参数改为double * doubleArr,确保和数组元素类型一致,指针自增和赋值都能正确操作double元素
  2. 替换递归为循环重试:用while(1)在当前循环内重试输入,避免递归导致的逻辑混乱和栈溢出
  3. 正确清空输入缓冲区:用while ((c = getchar()) != '\n' && c != EOF)手动读取到换行符,彻底清除无效输入后的残留内容,保证下一次scanf能正确读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:55:21