通用数组搜索器实现疑问:是否仅适用于动态分配数组?
你的通用数组搜索器其实同时支持静态和动态数组
嘿,别担心,你的这个实现完全不局限于动态分配的数组——不管是栈上静态分配的数组,还是堆上动态分配的数组,它都能正常工作。
为什么它能通用?
C语言里,不管数组是怎么分配的:
- 静态数组(比如
int arr[10];)在栈上是连续的内存块,传入函数时会退化为指向第一个元素的指针; - 动态数组(比如
int* arr = malloc(10*sizeof(int));)在堆上也是连续的内存块,本身就是指针类型。
你的代码核心逻辑是用char* p遍历连续内存,每次步进elem_size——这个逻辑只关心内存的连续性,和内存块是在栈还是堆完全无关。只要传入的arr是指向数组第一个元素的有效指针,elem_size是正确的元素大小,len是元素个数,就能正常遍历搜索。
给你个实际测试例子
我补全了回调函数的定义,写了个同时测试静态和动态数组的示例代码,你可以跑一下验证:
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> // 补全回调函数的类型定义 typedef bool (*arr_search_checker)(void*, void*); void *array_search( void *arr, size_t elem_size, size_t len, arr_search_checker v, void *match) { char *p = arr; for(unsigned i = 0; i < len; ++i) { if(v((void *) p, match)) return p; p += elem_size; } return NULL; } // 针对int类型的检查回调 bool check_int(void *elem, void *match) { return *(int*)elem == *(int*)match; } int main() { // 测试静态分配数组 int static_arr[] = {1, 3, 5, 7, 9}; int target = 5; int *found = array_search(static_arr, sizeof(int), 5, check_int, &target); if(found) { printf("静态数组中找到目标:%d\n", *found); } // 测试动态分配数组 int *dynamic_arr = malloc(5 * sizeof(int)); if(!dynamic_arr) { perror("malloc失败"); return 1; } for(int i = 0; i < 5; i++) { dynamic_arr[i] = i * 2; // 数组元素:0,2,4,6,8 } target = 6; found = array_search(dynamic_arr, sizeof(int), 5, check_int, &target); if(found) { printf("动态数组中找到目标:%d\n", *found); } free(dynamic_arr); return 0; }
几点注意事项
- 一定要保证
elem_size和数组元素的实际大小完全一致,否则会导致内存越界或错误的元素访问; - 回调函数里的类型转换必须和数组元素类型匹配,不然会出现未定义行为;
- 这个实现只适用于一维数组,多维数组的内存布局虽然也是连续的,但需要额外处理维度的步进逻辑,不过这和分配方式无关。
内容的提问来源于stack exchange,提问作者K. Koovalsky
相关产品推荐
相关产品推荐

