Основные проблемы:
Ваши типы не совпадают.В вызове getRegEx(&count, &keys)
тип выражения &keys
равен char ***
, а не char **
.Обратите внимание, что если вы хотите изменить значение keys
, вам придется передать на него указатель.Это приводит к следующей проблеме ...
Поскольку вы изменяете значение параметра keys
, а не то, на что оно указывает, любые изменения, внесенные в функцию, не являютсяотражается в звонилке.
Вот модифицированная версия вашего кода, иллюстрирующая то, что я думаю вы пытаетесь сделать:
struct record **getRegEx(int *counter, char ***keys)
{
...
// type of keys = char ***
// type of *keys = char **
// type of **keys = char *
*keys = malloc(*counter * sizeof **keys); // note no cast, operand of sizeof
if (*keys)
{
int j;
for (j = 0; j < *counter; j++)
{
// type of (*keys)[j] == char *
// type of *(*keys)[j] = char
(*keys)[j] = malloc(64 * sizeof *(*keys)[j]);
}
}
...
}
Обратите внимание, что я нене произнесите результат malloc
.Начиная с версии C, выпущенной в 1989 году, вам это не нужно, так что это избавляет от визуальных помех.Это также защищает вас от потенциальной ошибки;если вы забудете включить stdlib.h
или иным образом не создавать прототип для malloc
в области видимости, компилятор примет функцию, возвращающую int
.Без приведения вы получите диагностику в порядке «несовместимых типов для назначения».Добавление приведения подавит диагностику, и в результате вы можете иметь незначительные (или не очень тонкие) ошибки времени выполнения.
Также обратите внимание, что я использую sizeof
на объектах , не типы.Опять же, это помогает уменьшить визуальный беспорядок, а также защищает вас в случае, если вы решите изменить базовый тип keys
;Вам также не нужно обновлять каждый malloc
звонок.
Почему (*keys)[j]
вместо *keys[j]
?Выражение keys
- это не местоположение начала нашего массива, а указывает на это местоположение.Нам нужно разыменовать keys
, чтобы получить адрес массива, который мы затем расшифруем.