c - 调用 bsearch 时获取 "error: invalid initializer"

标签 c arrays bsearch

我有一个结构:

typedef struct DATA {
    char *key;
    char *parentKey;
    char *description;
} DATA;

还有一个实例数组:

DATA *data_array = NULL; // the global data array
int m_arrayLength = 0; // Keeps track of the number of elements used

填充数组后,我将使用 qsort 对其进行排序

void SortData()
{
    qsort(data_array, m_arrayLength, sizeof(DATA), CompareDataByKey);
}

int CompareDataByKey(const void *a, const void *b) 
{ 
    DATA *ia = (DATA *)a;
    DATA *ib = (DATA *)b;
    return strcmp(ia->key, ib->key);
}

这是按预期工作的。我正在尝试实现一种在数组中搜索特定项目的方法,这就是我卡住的地方

DATA FindDataByKey(char *key)
{
    DATA *searchData = malloc(sizeof(DATA));

    searchData->key = key;

    DATA result = bsearch(
        searchData, 
        data_array, 
        m_arrayLength, 
        sizeof(DATA), 
        CompareDataByKey);

    free(searchData);

    return result;
}

gcc 编译器返回消息:

p_CONNECT.c: In function 'FindDataByKey':

p_CONNECT.c:87: error: invalid initializer

make: The error code from the last command is 1.

在线 CompareDataByKey);

任何人都可以在我编写的代码的上下文中解释这个错误的含义吗?

最佳答案

您被编译器报告的行号抛弃了。 “不正确的初始化程序”消息指的是整个 DATA result = bsearch(...) 初始化/表达式,它以最后一个参数结束,而不是最后一个参数本身。

初始化器不正确,因为 result 被声明为 DATA(一个结构),并且 bsearch 返回一个指针。要修复它,请将 result 声明为指针:

DATA *result = bsearch(
        searchData, 
        data_array, 
        m_arrayLength, 
        sizeof(DATA), 
        CompareDataByKey);

修复该问题时,您还必须更改 FindDataByKey 以返回 DATA *,而不是 DATA。几个不相关的编码注释:

  • 调用bsearch时不需要malloc查找数据,直接在栈上初始化,将变量地址传给功能。例如:

    DATA searchData;
    searchData.key = key;
    return bsearch(&searchData, ...);
    
  • 如果您调用malloc,请不要忘记检查它的返回值。对 malloc 的调用可能会失败,最好将此失败报告给用户。 (通常的做法是创建一个类似于 xmalloc 的包装器,它调用 malloc,检查其结果,并打印一条错误消息并调用 exit () 如果结果为 NULL。)

  • 使用 m_ 为全局变量添加前缀会使具有 C++ 背景的用户感到困惑,其中 m_ 前缀表示类成员。

关于c - 调用 bsearch 时获取 "error: invalid initializer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143013/

相关文章:

c - printf中的f是什么意思?

c++ - DTracing objc_msgSend 不打印接收者类名

python - 如何在Python中计算单尾p值?

javascript - 如何不超出数组边界

c - 如何在c中正确使用bsearch?

c - 删除带有结构元素的单链表

c - 3d 数组在引用两次后打印地址?

c - 使用数组过滤数组

c - 对结构中的多个项目进行 bsearch

c - bsearch 未能在结构数组中找到字符串成员