如何让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++; } }
修改说明
- 修正指针类型:把
getDoubles的参数改为double * doubleArr,确保和数组元素类型一致,指针自增和赋值都能正确操作double元素 - 替换递归为循环重试:用
while(1)在当前循环内重试输入,避免递归导致的逻辑混乱和栈溢出 - 正确清空输入缓冲区:用
while ((c = getchar()) != '\n' && c != EOF)手动读取到换行符,彻底清除无效输入后的残留内容,保证下一次scanf能正确读取
内容的提问来源于stack exchange,提问作者nxover8
相关产品推荐
相关产品推荐

