Я просто пишу код, который должен перераспределить массив Икс указателей на константные строки А,Б,С (см. схему ниже):
_______ _______ _______ ________ ________________
|char* A|char* B|char* C|...|char** X|...|char*** pref_arr|...
""""""" """"""" """"""" """""""" """"""""""""""""
__ __
|\______________________/ |\__________/
У меня есть массив А,Б,С, указатель на этот массив X и указатель pref_arr, который указывает на Икс. У меня не было места в схеме, но все символы квалифицируются как константы.
Затем у меня есть следующий код
function(const char*** pref_arr, int new_length) {
const char** new_pref_arr = realloc(**pref_arr, sizeof(const char*) * new_length);
// some other stuff to do...
}
где я пытаюсь перераспределить массив Икс до длины новая_длина.
Проблема в том, что моя IDE предупреждает меня о том, что переход от const char*
к void*
отбрасывает квалификаторы.
ну... я только что обнаружил, что слишком много разыменовываю... какая глупая ошибка. Почему я должен был заметить это только потратив 20 минут на форматирование этого вопроса.
Это просто опечатка... так должно быть realloc(*pref_arr, ...)
не realloc(**pref_arr, ...)
@Adam Bajger Вы все равно можете помочь другим, отредактировав этот вопрос более подробно и ответив на него самостоятельно. Кроме того, я бы посоветовал отредактировать упоминания массива «X», поскольку его нигде нет в вашем коде.
Я бы посоветовал объявить struct
ures и выкинуть звезды. Плохо быть программист с тремя звездамиссылка на архив.
@KamilCuk проблема здесь в том, что мне нужно получить к нему доступ как к массиву строк, но мне нужно сохранить один указатель на массив в разных местах, поэтому, когда я его перераспределю где-то, он изменится и в другом месте. Я не понимаю, как структура облегчит задачу.
Для инкапсуляции. Для облегчения миграции. Для удобства чтения. Для объектно-ориентированного программирования. struct arrstr_s { char **strs; size_t cnt; }; int arrstr_resize(struct arrstr_s *t, size_t newlength) { void *pnt = realloc(t->strs, sizeof(*t->strs) * (t->cnt + 1)); t->strs = pnt; .... }
тогда мне кажется чище const char ***
.
@Kamil Cuk, но это просто добавляет много кода и, возможно, незначительные накладные расходы. Разве здесь не лучше объявить макрос?
Я согласен. Полагаю, небольшого typedef тоже достаточно.
проблема здесь в том, что вы слишком много разыменовываете, одна звездочка - это именно то, что вам нужно, а не две. Смотри ниже:
function(const char*** pref_arr) {
const char** new_pref_arr = realloc(*pref_arr, sizeof(const char*) * N);
// some other stuff to do...
}
Что вы делали в своем коде, так это то, что вы пытались перераспределить строку A (потому что **pref_arr
указывает именно туда - через двойное разыменование), что, вероятно, не то, что вы хотели.
Что такое декларация
pref_arr
?