Re: язык C в Linux: вопросы начального уровня
Добавлено: 28 ноя 2013, 16:26
Ещё одно нововведение C99 - массивы переменной длины (variable-length array, VLA).Olej писал(а):Одно из нововведений:Olej писал(а):C99 тоже заслуживают отдельного рассмотрения:
Код: Выделить всё
void show2( char *str1, char *str2 ) {
char *arr = " массив ", *len = " длины";
char name[ strlen( str1 ) + strlen( arr ) +
strlen( str2 ) + strlen( len ) + 1 ];
strcpy( name, str1 );
strcat( strcat( strcat( name, arr ), str2 ), len );
printf( "%s: %d байт\n", name, sizeof( name ) );
}
void test02( void ) {
show2( "показать", "переменной" );
};
1. Новички всегда первейшим делом норовят "увеличить" или "раздвинуть" массив - это такое всеобщее народное желание
2. С другой стороны, канон всякого языка со статической строгой типизацией (PASCAL, C, C++, Java, ...) вроде бы как постулирует, что массив - это структура с неизменными границами, ... а потом уже начинает добавлять всякие искусственные способы обойти эти ограничения (STL в C++, связные списковые структуры и др.)
3. Сам термин "массивы переменной длины" - он неоднозначный, и вносит путаницу ... по крайней мере на начальных этапах, "покрывая" собой 2 совершенно разных понятия:
- массивы, которые можно создавать с размером, заданным не константным выражением, вычисленным перед созданием (это, собственно, и есть VLA);
- массивы, размер которых можно изменять уже после их создания, по-ходу... (vector в STL, например), что правильно бы называть не массивами переменной длины, а ... динамическими массивами, массивами изменяемой длины и т.п.
Массивы VLA в стандарте C99 можно посмотреть здесь: Расширение массивов.
Там их пример-объяснение:
Код: Выделить всё
void f(int diml, int dim2)
{
int matrix[diml][dim2]; /* двумерный массив переменной длины */
/* ... */
}