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

线性搜索算法出现Segmentation Fault错误,如何解决?

解决线性搜索代码的段错误问题

核心错误分析与修复步骤

  • 参数传递错误触发段错误
    调用Output(*dizi,N,aranan)时,*dizi表示数组第一个元素的具体数值,而Output函数要求第一个参数是数组指针(int *dizi)。将普通数值当作内存地址传入,会导致程序访问非法内存空间,直接引发Segmentation Fault。
    修复:将调用语句改为Output(dizi, N, aranan)——数组名本身就是指向首元素的指针,直接传递即可。

  • 全局变量与局部变量冲突,导致数据传递混乱
    代码同时定义了全局的N、aranan和main函数内的局部同名变量:findValue函数修改的是全局aranan,但main函数传给Output的是未初始化的局部aranan,不仅逻辑错误,还会导致搜索目标值无效。此外全局变量的滥用会增加代码维护难度。
    修复:删除所有全局变量,改用函数返回值或指针参数传递数据:

    • 将findValue改为返回读取到的目标值(int类型),无需依赖全局变量。
    • 所有函数的输入输出都通过参数明确传递。
  • 函数返回值不符合声明
    所有声明为int类型的函数都未返回值,会触发未定义行为。根据函数功能调整返回类型:

    • ArrayBastir和Output无返回值,改为void类型。
    • findValue返回读取的目标值,保留int类型并补充return语句。

修正后的完整代码

#include <stdio.h>

void ArrayBastir(int *dizi, int N)
{
    printf("My numbers\n");
    for(int i = 0; i < N; i++)
    {
        printf("%d\n", dizi[i]);
    }
}

int findValue()
{
    int aranan;
    printf("The value you want to search: ");
    scanf("%d", &aranan);
    return aranan;
}

void Output(int *dizi, int N, int aranan)
{
    int found = 0;
    for(int i = 0; i < N; i++)
    {
        if(dizi[i] == aranan)
        {
            printf("%d number found in position %d.\n", aranan, i + 1);
            found = 1;
        }
    }
    if(!found)
    {
        printf("%d number not found in the array.\n", aranan);
    }
}

int main() {
    int N;
    printf("Please enter how many numbers you want to enter: ");
    scanf("%d", &N);
    int dizi[N];

    for(int i = 0; i < N; i++)
    {
        printf("Enter number %d: ", i + 1);
        scanf("%d", &dizi[i]);
    }

    ArrayBastir(dizi, N);
    int aranan = findValue();
    Output(dizi, N, aranan);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:55:40