На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Код, который не должен работать 0_o
    Камарады, прошу помощи в разборках!

    Есть код. По всем моим "пониманиям", данный код даже компилироваться (успешно) не должен:

    ExpandedWrap disabled
      #include <iostream>
      using namespace std;
       
      int main(){
          int size;
          cin >> size;
          int A[size];
          for(int i = 0; i < size; i++) cout << A[i] << " ";
          return 0;
      }


    А он компилируется и выполняется! :wacko: Проверял на ideone (С++11) и на wandbox (clang 3.9.1, С++1z)
    Куда катиться мир? Почему?
      Ну я б попробовал оправдать так:
      1.инициализируется size мусором и заводится мусорный массив A (во время компиляции).
      2.опосля вводится значение size и оно просто получается меньше мусорного в компиляции, а потому при выводе не вываливается с ошибкой доступа. Массив A же не переинициализируется, а остаётся в том своём мусорном виде.
        Цитата Славян @
        Ну я б попробовал оправдать так:
        1.инициализируется size мусором и заводится мусорный массив A (во время компиляции).
        2.опосля вводится значение size и оно просто получается меньше мусорного в компиляции, а потому при выводе не вываливается с ошибкой доступа. Массив A же не переинициализируется, а остаётся в том своём мусорном виде.

        Но ... вопрос к компилятору! Почему без constexpr не выдается ошибка?

        Добавлено
        Цитата Славян @
        1.инициализируется size мусором и заводится мусорный массив A (во время компиляции).

        Кстати да ... вопрос немного "ниже" ... а как узнать, что таки "завелось"?
          Почему не должен компилироваться? Вполне законный код. Там warnings должны выдаваться.

          Добавлено
          Цитата JoeUser @
          int A[size];

          В этом месте компилятор скорее всего вызывает функцию типа alloca, которая выделяет столько памяти на стекле, сколько было запрошено
            Туплююююю ... :fool: Дайте цитату из Стандарта, плс.
              Ошибся, в C++ Variable length arrays являются gcc'шным расширением языка. В C99 они действительно есть в стандарте и вроде как вызывается alloca.
              Сообщение отредактировано: shm -
                Цитата shm @
                В C99 они действительно есть в стандарте и вроде как вызывается alloca

                Если можно - дай линк почитать.
                  Цитата JoeUser @
                  Если можно - дай линк почитать.

                  Держи: https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
                    Благодарю! :good:
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0265 ]   [ 15 queries used ]   [ Generated: 19.05.24, 12:37 GMT ]