Инициализировать массив указателей в NULL

0

здесь, к моему первому сообщению на этом сайте.

Я пытаюсь инициализировать массив из 30 указателей в NULL. Массив хранится как глобальный, и я выполняю инициализацию в своей функции init() следующим образом:


static headerT* free_list[30];

....

init() { free_list[30] = {NULL}; }


Тем не менее, я получаю следующую ошибку-компилятор: "ошибка: ожидаемое выражение до" {токен ".

Любые мысли о том, что я могу делать неправильно?

Заранее спасибо.

  • 9
    Они уже инициализированы.
  • 2
    Просто удалите функцию init() .
Показать ещё 2 комментария
Теги:
arrays

3 ответа

3

объекты, выделенные статической продолжительностью хранения, инициализируются значением. Ваши указатели уже инициализированы значением nullptr.

2
  1. Если arr - массив из n элементов, то первая ячейка является arr[0] а последняя - arr[29]. arr[30] находится вне массива, и ссылка на него может вызвать всевозможные проблемы.
  2. Вы не можете присвоить значение целому массиву. Используйте цикл for для доступа к каждой ячейке.

Таким образом, мы получаем:

init() 
{ 
    int i;
    for(i=0; i<30; i++)
        free_list[i] = NULL; 
}
  • 4
    Для ясности, только указатели со статической продолжительностью хранения инициализируются в NULL по умолчанию.
  • 0
    Вы также можете инициализировать (нестатический) массив указателей в NULL (0), написав T* p[30] = { 0 }; , но вы не можете присвоить такое значение.
-1

Я предпочитаю memset

memset (free_list, 0x0, 30 * sizeof (headerT *));

  • 1
    Это сломается в системе, где нулевой указатель не представлен нулевыми битами.
  • 0
    Также он сломается, если размер списка изменится, вы, по крайней мере, могли бы использовать идиому memset( &x, 0, sizeof x ) чтобы гарантировать запись правильного объема памяти.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню