Получение "ошибка: неверный инициализатор" при вызове 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_ префикс обозначает членов класса.

Другие вопросы по тегам