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

C语言程序异常:无法进入Linear_Search()函数问题排查求助

无法进入Linear_Search()函数的原因排查与修复

首先,你代码里无法进入Linear_Search()函数的核心原因是函数调用方式完全错误,同时还有一堆语法和逻辑问题会导致程序崩溃,我来逐一拆解:

一、为什么函数没被调用?

在你的main()函数里,犯了两个关键错误:

  1. 你写了void Linear_Search();——这是函数声明,不是调用语句!而且C标准不允许在函数内部声明其他函数(部分旧编译器可能兼容,但属于不良写法)。
  2. 在case 1分支里,你根本没写出正确的调用代码(只写了半截的void Linear_Sear...),正确调用函数只需要写Linear_Search();,不需要加返回类型void。

二、Linear_Search()函数内部的致命bug

就算你成功调用了函数,程序也会崩溃或者逻辑错误,这些问题必须修复:

  • scanf("%d", n);:scanf要求传入变量的内存地址,这里直接传n会导致内存访问错误,必须改成scanf("%d", &n);。
  • 循环后的多余分号:你写的for (i = 0; i <= n; i++); { ... }里,循环末尾的分号会让循环体变成空语句,后面的大括号代码只会执行一次;同时i <= n会导致数组下标越界(数组下标范围是0到n-1),应该改成for (i = 0; i < n; i++) { ... }。
  • if语句后的多余分号:if (q == arr[i]); { ... }里的分号会让条件判断失效,不管是否匹配都会执行大括号里的代码,直接去掉这个分号即可。
  • 变量重复定义+未初始化:你在Linear_Search()里重新定义了arr[n]和n,但定义数组时n还未赋值,会导致数组大小不确定,出现未定义行为,应该先输入n再定义数组。
  • getch()兼容性问题:getch()是非标准函数,很多现代编译器(比如GCC)不支持,换成标准的getchar()就行。

三、修复后的完整代码

#include <stdio.h>
// 全局声明函数,避免内部声明的问题
void Linear_Search();

// 标准main函数返回类型是int,不是void
int main() {
    printf("ALL SEARCHING TECHNIQUE\n");
    printf("Choices\n");
    printf("1.Linear Search\n2.Binary Search\n3.Interpolation Search\n4.Jump Search\n");
    
    int select;
    scanf("%d", &select);
    
    switch (select) {
        case 1:
            printf("This is Linear Search\n");
            Linear_Search(); // 正确的函数调用
            break;
        default:
            printf("Invalid choice!\n");
    }
    return 0;
}

void Linear_Search() {
    int i, q, flag = 0, num, n;
    
    printf("Enter the number of array elements: ");
    scanf("%d", &n); // 传入变量地址
    
    // 先获取n,再定义变长数组(C99及以后支持)
    int arr[n];
    
    printf("Enter the %d numbers: ", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    printf("Enter the number to be searched: ");
    scanf("%d", &q);
    
    for (i = 0; i < n; i++) {
        if (q == arr[i]) {
            num = q;
            flag = 1;
            break; // 找到后直接跳出循环,优化性能
        }
    }
    
    if (flag == 1) {
        printf("Found! Number is %d\n", num);
    } else {
        printf("Number not present in the array\n");
    }
    getchar(); // 替换getch(),兼容更多编译器
}

额外提示

  • 标准C语言中main()必须返回int,不能用void,否则会有未定义行为。
  • 如果你需要兼容更老的编译器(不支持变长数组),可以用动态内存分配:
    int *arr = (int*)malloc(n * sizeof(int));
    // 使用完后记得释放内存
    free(arr);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:06