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

通用数组搜索器实现疑问:是否仅适用于动态分配数组?

你的通用数组搜索器其实同时支持静态和动态数组

嘿,别担心,你的这个实现完全不局限于动态分配的数组——不管是栈上静态分配的数组,还是堆上动态分配的数组,它都能正常工作。

为什么它能通用?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:23:25