Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.38.24] |
|
Сообщ.
#1
,
|
|
|
Камарады, прошу помощи в разборках!
Есть код. По всем моим "пониманиям", данный код даже компилироваться (успешно) не должен: #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; } А он компилируется и выполняется! Проверял на ideone (С++11) и на wandbox (clang 3.9.1, С++1z) |
Сообщ.
#2
,
|
|
|
Ну я б попробовал оправдать так:
1.инициализируется size мусором и заводится мусорный массив A (во время компиляции). 2.опосля вводится значение size и оно просто получается меньше мусорного в компиляции, а потому при выводе не вываливается с ошибкой доступа. Массив A же не переинициализируется, а остаётся в том своём мусорном виде. |
Сообщ.
#3
,
|
|
|
Цитата Славян @ Ну я б попробовал оправдать так: 1.инициализируется size мусором и заводится мусорный массив A (во время компиляции). 2.опосля вводится значение size и оно просто получается меньше мусорного в компиляции, а потому при выводе не вываливается с ошибкой доступа. Массив A же не переинициализируется, а остаётся в том своём мусорном виде. Но ... вопрос к компилятору! Почему без constexpr не выдается ошибка? Добавлено Цитата Славян @ 1.инициализируется size мусором и заводится мусорный массив A (во время компиляции). Кстати да ... вопрос немного "ниже" ... а как узнать, что таки "завелось"? |
Сообщ.
#4
,
|
|
|
Почему не должен компилироваться? Вполне законный код. Там warnings должны выдаваться.
Добавлено Цитата JoeUser @ int A[size]; В этом месте компилятор скорее всего вызывает функцию типа alloca, которая выделяет столько памяти на стекле, сколько было запрошено |
Сообщ.
#5
,
|
|
|
Туплююююю ... Дайте цитату из Стандарта, плс.
|
Сообщ.
#6
,
|
|
|
Ошибся, в C++ Variable length arrays являются gcc'шным расширением языка. В C99 они действительно есть в стандарте и вроде как вызывается alloca.
|
Сообщ.
#7
,
|
|
|
Цитата shm @ В C99 они действительно есть в стандарте и вроде как вызывается alloca Если можно - дай линк почитать. |
Сообщ.
#8
,
|
|
|
Цитата JoeUser @ Если можно - дай линк почитать. Держи: https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html |
Сообщ.
#9
,
|
|
|
Благодарю!
|