1

我有一个结构:

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:在函数“FindDataByKey”中:

p_CONNECT.c:87:错误:初始化程序无效

make:最后一条命令的错误代码为 1。

在线的CompareDataByKey);

谁能在我编写的代码的上下文中解释这个错误的含义?

4

1 回答 1

4

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

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

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

当您修复它时,您还必须更改FindDataByKey为 return DATA *,而不是DATA。几个不相关的编码备注:

  • 调用时不需要malloc查找数据bsearch,只需在栈上初始化,将变量的地址传给函数即可。例如:

    DATA searchData;
    searchData.key = key;
    return bsearch(&searchData, ...);
    
  • 如果你调用malloc,不要忘记检查它的返回值。调用malloc可能会失败,最好向用户报告此失败。(这样做的习惯方法是创建一个名为类似的包装器xmalloc,它调用malloc、检查其结果并打印错误消息并exit()在结果为 NULL 时调用。)

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

于 2013-11-22T10:58:38.520 回答