И попутный вопрос опытным программистам c/c++, разрешите полюбопытствовать, а как вообще возможна такая конструкция
int a=12345;
char с[a];
и что в реале получается? Наверное это чтото из оперы char 20[c], но как разворачивается char c[a] и почему это глотает компилятор я не пойму...
Всё что нарыл в гугле за последний часик сводится к тому, что это верно с точки зрения стандарта C99 и, по идее, должно быть в C++0x, но вот с точки зрения C89 и C++98 это не верно. g++ даже с ключём -ansi, а так же и с эквивалнтным ему ключём -std=c++98 даже варнинга не выдаёт, единственный способ заставить его делать хоть что-то это использовать -pedantic тогда он генерит на эту конструкцию предупреждение:
g++ test.cpp -Wall -pedantic -o test
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10: warning: ISO C++ forbids variable length array ‘arr’
Нужно это за тем, чтобы уменьшить фрагментирование памяти и избежать частых вызовов malloc/free внутри функции, размещая массив прямо на стеке:
void do_something(double *arr, int size)
{
double buf[n];
// work with arr and buf
}
этот код будет работать несколько быстрей нежели если в начале буфер будет создаваться в динамической памяти а потом освобождаться, особенн это хорошо, тем, что куча не фрагментируется из за частых промежуточных malloc/free. В обсуждениях C++0x довольно интересные конструкции попадались, позволяющие использовать эту фичу в классах и структурах:
struct Matrix { float data[]; Matrix(int M, int N) : data[M,N](0) {} };
Пользователь решил продолжить мысль 08 Октября 2010, 01:28:09:
Вот только сразу замечу, что если значение переменной которая будет переданна в качестве размерности ассива идёт не из на 100% надёжного источника, то мы получим stack overflow и приложение рухнет, так что это расширение не очень безопасно, и работать с ним нужно с умом и большой осторожностью.
Например,сли при чтени данных из сокета первые 4 байта это размер последующего сообщения. Сообщения складываются в VLA массив, объявление которого сделанно до проверки вычитанной длинны сообщения на разумность, то завалить такой сервис удалённой атакой задача тривиальная.