我有一个结构:
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/