Как удалось создать и получить доступ к структурам, которые вели себя как массивы в C89?

Перед программистами C99 было необходимо определить все массивы с фиксированными размерами, которые были известны во время компиляции. Как людям удалось создать и получить доступ к структурам, которые вели себя как массивы, но размеры которых не были известны до выполнения?

3
nl ja de
Программистам ANSI C никогда не приходилось определять все массивы с фиксированными размерами, которые были известны во время компиляции, если только по массиву вы не имеете в виду «массив в стеке», и в этом случае ваш вопрос почти отвечает сам.
добавлено автор djechlin, источник
они использовали темную магию ^ D ^ D ^ D ^ D ^ D ^ D ^ D ^ D ^ D ^ D malloc() .
добавлено автор Stephen Canon, источник
@Haz О, так это не только я помню об этом. Я тоже отредактирую это.
добавлено автор user529758, источник
Разве это не C99, который допускал массивы переменной длины в стеке?
добавлено автор Haz, источник

2 ответы

С помощью malloc (3) и free (3) для динамического управления памятью. Это все еще сделано сегодня.

void f(int n)
{
  int *nInts = malloc(n * sizeof(int));

  /* do stuff with 'nInts' */

  free(nInts);
}
5
добавлено
@CarlNorum: Спасибо.
добавлено автор Jack, источник
что может случиться, если в реализации VLA C99 нет памяти? Я знаю, что malloc() возвращает NULL. Но в случае VLA появляется сообщение об ошибке из операционной системы или что-то в этом роде?
добавлено автор Jack, источник
Является ли это тем, что массивы переменной длины обычно реализуются в C?
добавлено автор templatetypedef, источник
@Vlad - хороший звонок, это более похоже на VLA C99. Это, однако, нестандартно.
добавлено автор Carl Norum, источник
@Jack, вы получите переполнение стека, что может вызвать любое количество проблем.
добавлено автор Carl Norum, источник
@ Vlad - не проблема. Я не знал, что это плохое место.
добавлено автор Carl Norum, источник
@Jack: именно поэтому VLAs не так полезны, как вы думаете.
добавлено автор Steve Jessop, источник
@CarlNorum: Я изменил ссылки на man-страницу. Надеюсь, вы не против. Пожалуйста, не используйте чистую точку, если это возможно. Это самый мозговой мертвый веб-сайт с тоннами устаревшей, ненадежной информации, которая генерирует деньги через агрессивный SEO. Здесь, в SO, многие люди борются с этим дерьмом :)
добавлено автор user405725, источник
Или alloca() и no free() :-D
добавлено автор user405725, источник
@templatetypedef Да, это так. Или, начиная с C99, вы также можете иметь массивы стеков переменной длины.
добавлено автор user529758, источник
Ссылки на страницы руководства примерно так же объясняются, как вы можете получить без примеров. Если вам нужны примеры, посмотрите здесь
добавлено автор Haz, источник
большое спасибо, ребята :))
добавлено автор Alamelu, источник
можете ли вы объяснить это немного больше, пожалуйста? :))
добавлено автор Alamelu, источник

Я думаю, вы имеете в виду это .

Как сказано там, это не совсем уверен, что это законно или переносимо. Тем не менее, я видел такой код, но никогда не писал его сам.

0
добавлено