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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:27:04