我有一个结构:
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);
任何人都可以在我编写的代码的上下文中解释这个错误的含义吗?
答案 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_
前缀表示类成员。