C — Динамическая инициализация массивов
-
05-07-2019 - |
Вопрос
Я пытаюсь найти эквивалент int myArray[n], но я не знаю, что такое n без ввода.
Должен ли работать следующий код?(Мне нужно использовать kmalloc вместо malloc).
int * pages;
//... later, after we find out n...
pages = (int *)kmalloc(npages * sizeof(int));
При отладке с помощью GDB значение Pages[0] не равно 0 – это ожидаемо?
Решение
Да.Память не инициализируется, вы просто получаете указатель на свой участок памяти.
Вам нужно будет memset
чтобы инициализировать его:
memset(pages, 0, npages * sizeof(int));
А еще, если я не ошибаюсь kmalloc
берет второй параметр, тип выделяемой памяти.
Другие советы
malloc
возвращает указатель на какое-то место в куче, выделенное для вашего массива. Это не инициализирует эту память. Вы можете использовать calloc
вместо malloc
, чтобы инициализировать память (установить на ноль), или вы можете использовать memset
после выделения памяти и установите память на ноль самостоятельно.
Поскольку вы используете kmalloc
, вам, вероятно, придется использовать memset
; Я не верю, что есть cmalloc
для выделения инициализированной памяти в ядре.
В качестве альтернативы вы можете использовать функцию ядра kzalloc
int * pages;
pages = (int *)kzalloc(npages * sizeof(int), GFP_KERNEL);