Пустой массив объявленный как arr_Value[ ] = { }; выводит значения. почему?

не понимаю эту строку.

п.с. вообще delay не люблю, из за них вечно косит данные, если несколько процессов(у меня несколько датчиков температуры). в этом случае получается ±1 измерение. я поставил delay(100) и 1 секунду, чтобы уменьшить цикл для наглядности, получается что должно быть 10 замеров, начинаем с нулевой позиции, поэтому на порядковом номере 9 заканчиваем, вот что иногда выскакивает:

7|5.12
8|5.12
9|5.12
10|0.50

№10 не должно быть по идее.

ну это так… поговорить, я сам поправлю. спасибо. буду дальше анализировать

И что, по вашему, должно произойти, если вы запросили элемент 10 ? Контроллер взорваться должен?

С/С++ - это язык, который ничего не запрещает программисту. Хотите читать элементы массива за его границей - читайте.
Язык считает, что вы понимаете, что делаете.

А если не понимаете и получается хрень - то никто не виноват , кроме вас

вопрос был в верности моего убеждения: “ведь объявляя с равенством “={}” по-моему объявляем с нулевыми значениями? или я ошибаюсь”, в следующем после Вашего поста ответе мне указали что это не верно.

ок, спасибо. я выложил результаты предложенного мне кода и сразу указал что это “поговорить“ и что я сам решу это вопрос.

ошибаетесь, причем дважды.

Во-первых, как уже сказали, пустой лист инициализации " { } " не знает, сколько должно быть значений. Эту ошибку вроде разжевали уже.

Ну а во-вторых, далеко не всегда пустой лист инициализирует значение нулями. Это верно только в случае глобальных и статических переменных

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

В языке массив не может иметь нулевую длину, но расширение GCC это допускает. Имейте в виду.

А в какой форме ответ? Ссылка на первый нераспределённый элемент памяти?

Да. Это довольно распространённый приём программирования, когда в хвост структуры ставится массив нулевой (единичной, если хотите соблюдать стандарт) а при запросе памяти под структуру (когда уже известно, сколько нужно элементов) запрашивается “сколько надо”. В итоге имеем “честный массив”, которым пользуемся как массивом безо всяких ограничений (выход за границы массива ни в С, ни в С++ не проверяется).

Я как-то готовил пример для своей рубрики, но не доделал, сейчас, если найду, доделаю и выложу.

P.S. Нашёл и вспомнил почему тогда забросил. Хоть сколько-нибудь осмысленный пример простым не получается, а объёмный пример – как-то не особо уместно. Опять забросил :frowning:

Тогда ответ на вопрос ТС - потому что читается случайная память, расположенная за полученным указателем и перед использованием массива нужно выделять память под необходимое количество данных? А если память уже выделялась под что то до использования массива, то использование этого указателя затрёт данные. Т.е. получать указатель в начале программы может привести к краху памяти в процессе выполнения?

1 лайк

Ну, конечно, память под массив нужно выделять. Иначе он просто будет читать (а, главное, писать) чужую.

это точно? я не особо разбираюсь, но это как то странно, интуитивно хочется думать что “размеченная ранее” память не может быть занята другими данными, думал что в худшем случае можно попасть на случайные данные которые уже не используются, где они берутся правда эти случайные данные пока не готов предполагать.

_vk.com/clip-233513381_456239832

он показывает что это все таки не обязательно, и нет никаких пределов, как и правильно и нет))) но это не точно!
но для вашей задачи он наверное не подойдет…