Peter написал:
Всегда инициализировал так
char arr[<n>]="xxxx";
и не знаю, что в этом сложного. Лишь бы символов было меньше n.
сложность в поддержке, если вы задаёте n и уж тем более, если задаёте n в виде макроса. Очень легко забыть изменить это n. Лучше вообще не задавать. А для новичков лучше вообще не пользоваться этой мутной и нелогичной фичей.
voral написал:
Мало того, что свободное выкидывание на помойку лишней памяти - т.е. путь к быдло коду.
не только. Так делает не только уважаемый Пётр, но и почти все кодеры. Да и компилятор выравнивает, добавляя много байт. Такие дыры очень удобны для злоумышленников, что-бы встраивать туда вредоносный код.
Peter написал:
Не меьнше n/2-1 требуется, чтобы хватило для русского текста в UTF-8.
вообще-то в UTF-8 допустимы символы размером 6 байт. Злоумышленник может вам заслать ЛЮБЫЕ символы. Как вы думаете, к чему это приведёт? Правильно, к переполнению буфера, ибо в С/С++ в рантайме никаких границ никогда не проверяется.
Peter написал:
Я не знаю, вводят ли в программах на C текст на китайском и ему подобных,
но если и вводят, то они уже знают, сколько для этого требуется байтов на символ.
6 штук максимум. Т.е. если вы выделили в стеке для 20 букв 50 байтов (41 + 9 запаса), то у вас - дыра. Даже если вы проверили, символ это или не символ. Злоумышленнику достаточно всего 5и неучтённых байт, что-бы поменять адрес возврата. И ваша функция вернёт управление не обратно, а туда, куда надо (тому, кто это ввёл).
ЗЫЖ про статические переменные в С - это ЗЛО.