Задание размерности массива неконстантой.
От: Dr.Offset  
Дата: 27.01.07 11:30
Оценка:
Мне в первую очередь интересны мнения.

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

Есть такой код (скажу сразу, я бы в жизни не додумался написать такое, однако, есть добрые люди, посдказали :

int main(int argc, char * argv[])
{
    int arr[argc]; // что это мы тут такое творим!??
    return 0;
}

Mingw v3.4.2, проглотил этот код без каких-либо предупреждений, даже при выставленной опции компиляции -Wall.
Он скомпилировал и такой код:
int main(int argc, char * argv[])
{
    const int size = argc;
    int a[size];
    return 0;
}

Потом я стал экспериментировать и написал вот что:
int f(int a)
{
    return a;
}

int main(int argc, char * argv[])
{
    int size;
    std::cin >> size;
    const int b = f(size);
    std::cout << b << std::endl; // b будет равно тому, что мы записали в size
    int a[b];

    return 0;
}

Может конечно в этом коде заключен какой-то скрытый смысл, коего я непонимаю. Но мне кажется, что это все неверно и компилироваться не должно. Это подтвердили тесты на других компиляторах и просмотр стандарта ISO/IEC 14882 за 98 год...

У кого какие мнения на сей счет?
Re: Задание размерности массива неконстантой.
От: _nn_  
Дата: 27.01.07 11:34
Оценка: +1
Здравствуйте, Dr.Offset, Вы писали:

<skip>

DO>У кого какие мнения на сей счет?


C99 допускает создавание массивов с неконстантным размером.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Задание размерности массива неконстантой.
От: Dr.Offset  
Дата: 27.01.07 11:42
Оценка:
Здравствуйте, _nn_, Вы писали:

__>C99 допускает создавание массивов с неконстантным размером.


Это компилировалось как С++
Re[3]: Задание размерности массива неконстантой.
От: _nn_  
Дата: 27.01.07 11:51
Оценка: 1 (1)
Здравствуйте, Dr.Offset, Вы писали:

DO>Здравствуйте, _nn_, Вы писали:


__>>C99 допускает создавание массивов с неконстантным размером.


DO>Это компилировалось как С++


Возможно это расширение GCC.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Задание размерности массива неконстантой.
От: Dr.Offset  
Дата: 27.01.07 12:08
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Возможно это расширение GCC.

Ты прав.

Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C89 mode and in C++. (However, GCC's implementation of variable-length arrays does not yet conform in detail to the ISO C99 standard.) These arrays are declared like any other automatic arrays, but with a length that is not a constant expression. The storage is allocated at the point of declaration and deallocated when the brace-level is exited. For example:

FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
  char str[strlen (s1) + strlen (s2) + 1];
  strcpy (str, s1);
  strcat (str, s2);
  return fopen (str, mode);
}

отсюда http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_5.html
Re: Задание размерности массива неконстантой.
От: ilnar Россия  
Дата: 27.01.07 13:37
Оценка:
Здравствуйте, Dr.Offset, Вы писали:

DO>Мне в первую очередь интересны мнения.


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


DO>Есть такой код (скажу сразу, я бы в жизни не додумался написать такое, однако, есть добрые люди, посдказали :


DO>У кого какие мнения на сей счет?


выделение памяти под такой массив может проводиться также, как если бы вы написали
char *a = alloca(size);
т.е. выделяется из стека нужный объем.
это только один вариант, не исключено счто компилятор это место реализует по другому
Re: Задание размерности массива неконстантой.
От: Андрей Тарасевич Беларусь  
Дата: 27.01.07 21:22
Оценка:
Здравствуйте, Dr.Offset, Вы писали:

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


Компилятор GCC хорошо известен тем, что реализует немалое количество разнообразных расширений стандарта языков С и С++. Все эти расширения прекрасно описаны в документации к компилятору. Дял того, чтобы компилятор предупреждал об использовании подобных расширений следует при компиляции указывать ключи '-ansi -pedantic'. При этом следует иметь в виду, что даже при использовании этих ключей нестандартный код может приводить не к ошибке, а лишь к предупреждению.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.