Создание фиксированного массива - какого чёрта оно работает?

вот мой вопрос от туда же, сам чуть моск не потерял))

щупал тут ESP32-S2-Mini
но не суть, в одном из файлов примеров, конкретно в USBVendor.ino
встречаю такое :face_with_monocle:

while (HWSerial.available()) {
    size_t l = HWSerial.available();
    uint8_t b[l];
    l = HWSerial.read(b, l);
    Vendor.write(b, l);
  }

эттт че так можно?
я про строчку 3, типа альтернатива new и alloc-ам всяким?
или мне интерпретатор вместо сей тайком подпихнули?

Петрович, у мнняяя ща с сердцем плохо будет, :exploding_head:пролей свет пожалуйста.

Dinosaur плата та какая?

1 лайк

Главное стеком на кучу не наскочить … хз сколько там байт прилетело …

Ну да, один к одному ситуация. Я случайно выделил массив по-староверски, нажал кнопку скомпилировать (с твёрдым намерением выделить память через new как только оно вывалится по ошибке) а оно не вывалилось. Ну и началась развлекуха.

Так жамкнул вроде кнопку спасибную?

Про размер понимаю, там до 10 байт прилетает, так что не сильно страшно.

Этот лишь предположение, которое нигде не проверяется.

А если available() в const получить - это, в принципе, формально отвечает требованиям? Scope - локальный, на его уровне const будет.

Я понял эту мысль (у меня список команд перед глазами которые шлёт эта железка, все до 10 байт, данные забираю из буфера вовремя. Плюс (если мне память не изменяет) размер буфера Serial 64 байта, так что пока не вижу повода для паники.

А вот эту мысль не понял - то что мы объявим переменную const не сделает её известной во время компияции…

Ну да, это тупиковая гипотеза.
Тогда жёстко задавать размерность, проверяя abailable() на допустимую длину или new/delete юзать. Третий вариант - побайтгый разбор на лету.

Не, вы мысль не уловили, я в 14 сообщении написал. То бишь оно неожиданно (для меня и авторов букварей, которые я читал до этого) заработало без выделения памяти через new (в ардуино IDE), камрад xDriver объяснил почему.

есть прекрасная альтернатива new - функция alloc(). Хапает на стеке памяти скока надо, которая потом автоматически освобождается при выходе из функции. И куча не трогается лишний раз. Боюсь, что твой локальный динамический массив унутре реализован именно так

Да, кстати, забыл про malloc/calloc.
Неплохая альтернатива. Динамическое выделение памяти в си

Заодно сразу можно на переполнение проверить.

Только насчёт автовысвобождения я что-то не уверен.

ну да, alloca вероятно делает ту же работу судя по описанию.

Вообще-то new внутри себя реализован через malloc, поэтому говорить что это “альтернатива” я бы не стал

Да, епрст, устроили матрёшку ))

alloca на самом деле

1 лайк

Он имел в виду alloca, так что это действительно альтернатива.

Да, конечно alloca(). Я апшыпся

И правильно не уверен. А вот у alloca с ним всё в порядке, но там другие грабли - нет возможности узнать выделилось ли и не перепахало ли кучу

1 лайк

Вот объясните мне, простому обывателю принцип работы динамической памяти на МК. Там нет независимых потоков, нет ОС за всем следящей. В процессе работы откуда программа знает где и сколько можно выделить? Вот не пойму никак. Одно дело когда компилятор всё просчитывает и заранее знает где и что в памяти.