Получение "ошибка: неверный инициализатор" при вызове 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 ответ
Вы сбиты с толку номером строки, сообщенным компилятором. Сообщение "неверный инициализатор" относится ко всему 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
, проверяет его результат, печатает сообщение об ошибке и вызываетexit()
если результат равен NULL.)Префикс глобальной переменной с
m_
будет сбивать с толку пользователей, приходящих из C++ фона, гдеm_
префикс обозначает членов класса.