@IndusDev

Почему в Си допускается переполнение массива?

Столкнулся с проблемой.
Почему строковый массив может переполняться без какой-либо ошибки?
При объявлении, например, char c[10], я могу дать значение c[12] и вывести его. Почему так происходит?
  • Вопрос задан
  • 1123 просмотра
Решения вопроса 3
TrueBers
@TrueBers
Гуглю за еду
Потому что это проверка на переполнение даёт лишние накладные расходы при выполнении. Изначально язык разрабатывался с расчётом на эффективность, с девизом что-то типа: «не нужно платить за то, чем не пользуешься».

По сути, Си — это просто высокоуровневый ассемблер. В ассемблере нет понятия ошибок вообще, всё на плечах разработчика. Если ему нужно проверять на переполнение, он сам должен реализовать этот функционал, а не терять на этом производительность, когда ему это не нужно.
Ответ написан
Комментировать
@MiiNiPaa
В С операция индексирования это синтаксический сахар над операциями с указателями: по стандарту а[b] полностью эквивалентно *(a+b). Это, кстати, позволяет весёлые штуки вроде 4[a]. Поэтому операция индексирования не может иметь иного поведения нежели операции над указателями.

Ещё С не занимается управлением памятью, отдавая это на откуп программиста. Поэтому, в общем случае, проверить принадлежит какая-либо область памяти массиву невозможно - этим занимается программист (если ему это нужно)

Также С исповедует принцип "не плати за то, что не нужно". Большинству людей не нужна проверка границ массивов. Те кому нужна, могут сделать её самостоятельно.
Ответ написан
Ocelot
@Ocelot
Расплата за скорость работы программы. Си - довольно низкоуровневый язык. Повыше ассемблера, но не сильно. С одной стороны, быстрый и лёгкий код, за счет отсутствия кучи проверок. С другой - куча возможностей отстрелить себе ноги по самый копчик. Не следил за границами массивов - сам виноват.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@ralaton121
Потому что это идеология такая у Си.
Си - это как бы ассемблер, но чуть поудобнее. И все на ответственность программиста.

Дополнительные проверки можно включить в настройках компилятора. Но это заметно влияет на производительность. Впрочем, для очень многих задач - разница не критична.

Как вариант - используйте "статические анализаторы".
Они проверяют код на подозрительные места не во время исполнения, поэтому можно и скорость максимизировать и ошибок избежать.
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Потому что С - низкоуровневый язык. Как уже говорили, a[b] - всего лишь иная форма записи *(a+b), что позволяет делать мнооооожество финтов ушами :) man memmove например почитайте :) - это вообще адЪ :) Существует множество либ, содержащих например те же strcpy, strcat, strstr, но обвешанные различными проверками - кому надо, тот их использует.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему строковый массив может переполняться без какой-либо ошибки?

Потому что диагностика такой ошибки не требуется от реализаци. Есть реализации диагностирующе такие ошибки, например gcc + ASAN.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час