C语言用函数指针查找数组元素的代码编译通过但无输出,是什么问题?
代码错误原因及修复方案
- 核心错误位于
search函数的指针转换逻辑:
主函数传入search的arr参数是数组首地址,本质是指向首元素的int*类型(被隐式转为void*入参)。原代码中char* ptr = *(char**)arr;的写法错误地将void*强转为二级指针再解引用,相当于把数组第一个元素的数值(本案例中为整数2)当作内存地址赋值给ptr,后续遍历过程中访问ptr + i * ele_size属于非法内存访问,触发操作系统段错误,程序直接终止,因此无任何输出。 - 修复方案:
仅需修改search函数中ptr的赋值逻辑,直接将入参arr强转为char*即可,无需解引用:char* ptr = (char*)arr;
修复后完整代码
#include <stdio.h> #include <stdbool.h> bool compare( const void* a, const void* b) { return (*(int*)a == *(int*)b); } int search(const void * arr, int arr_size, int ele_size, void* x, bool compare(const void*, const void*)) { char* ptr = (char*)arr; int i; for (i = 0; i < arr_size; i++) { if (compare(ptr + i * ele_size, x)) { return i; } } return -1; } int main() { int arr[] = { 2, 5, 7, 90, 70 }; int n = sizeof(arr) / sizeof(arr[0]); int x = 7; printf("Returned index is %d ", search(arr, n, sizeof(int), &x, compare)); return 0; }
修改后程序正常输出Returned index is 2 ,符合预期结果。该实现保留了泛型查找的能力,只要传入对应类型的compare函数即可支持不同类型数组的查找。
内容的提问来源于stack exchange,提问作者Hash Blog
相关产品推荐
相关产品推荐

