线性搜索算法出现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
相关产品推荐
相关产品推荐

