调用bsearch时出现“错误:无效的初始化程序”

时间:2013-11-22 10:49:07

标签: 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:在函数'FindDataByKey'中:

     

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

     

make:最后一个命令的错误代码是1.

CompareDataByKey);

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

1 个答案:

答案 0 :(得分:4)

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

初始化程序不正确,因为result被声明为DATA(结构),bsearch返回指针。要解决此问题,请将result声明为指针:

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

解决问题后,您还必须更改FindDataByKey以返回DATA *,而不是DATA。几个不相关的编码备注:

  • 调用malloc时,您不需要bsearch搜索数据,只需在堆栈上初始化它并将变量的地址传递给函数即可。例如:

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

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