C语言自定义全局函数获取向量首个非零值返回结果异常求助
问题原因
你的代码出现该问题有两个核心原因:
- C语言默认采用值传递规则:调用
primeiro函数时传入的k1/k2只是原变量的副本,函数内部修改的是副本值,完全不会影响main函数中k1、k2本身的取值。且你的函数逻辑中不需要传入第二个参数,你直接在函数内部就把f初始化为0使用,传入的参数本质是无效冗余参数。 primeiro函数已经将找到的第一个非零值索引作为返回值返回,但你调用函数时没有接收该返回值,因此k1、k2始终保留初始赋值的1。
修复方案
最简修改方式是删除函数冗余的第二个参数,调用时直接用变量接收函数返回值即可,修正后代码如下:
#include <stdio.h> #include <math.h> #include <stdlib.h> // 传入数组和数组长度,避免全零数组越界 int primeiro(float vec[], int len) { int f = 0; // 浮点数不要直接用==判断是否为0,用绝对值小于极小阈值判断更稳妥 while(f < len && fabs(vec[f]) < 1e-6) { f++; } return f; } int main() { float poli1[4]={1,2,3,4}, poli2[4]={0,0,5,6}; int k1=1, k2=1, i; printf(" \n"); for(i=0; i<4; i++) { printf("%g\t", poli1[i]); } printf("\n \n"); for(i=0; i<4; i++) { printf("%g\t", poli2[i]); } printf("\n \n"); // 接收函数返回值赋值给k1、k2 k1 = primeiro(poli1, 4); printf("%d \n", k1); k2 = primeiro(poli2, 4); printf("%d \n", k2); return 0; }
修改后输出就符合预期:k1=0、k2=2。同时新增的数组长度校验和浮点数判断逻辑,可避免数组全零时出现越界访问崩溃的问题。
内容的提问来源于stack exchange,提问作者Bruno Stühler
相关产品推荐
相关产品推荐

