Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
#1

Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? - C++

21.08.2016, 10:43. Просмотров 276. Ответов 14
Метки нет (Все метки)

Всем привет. Долгое время не писал на плюсах, решил пройтись по основам, вспомнить.

По непонятным для меня причинам этот код КОМПИЛИРУЕТСЯ. И программа даже не вылетает при задании размера массива -1. Почему?

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
    int size;
    cin >> size;
 
    int arr[size];
 
    arr[0] = 10;
 
    cout << arr[0] << " ";
 
    return 0;
}

http://www.cyberforum.ru/cpp-beginners/thread1254831.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2016, 10:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? (C++):

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под...

Почему в массив фиксированного размера N возможно записать элементов больше, чем N ?
почему если я создаю массив char a, то могу в него записывать больше одного...

Не компилируется почему-то
Вот код программы, она вроде как бы работает, но все равно выдаются ошибки,...

Почему не компилируется?
Привет, перейду сразу к делу. Вот все говорят, что Visual Studio самая крутая...

Почему не компилируется?
Возник вопрос. Почему не компилируется? int main() { setlocale(LC_CTYPE,...

14
Пупкин Саша
0 / 0 / 0
Регистрация: 21.08.2016
Сообщений: 5
21.08.2016, 10:45 #2
Вы собираетесь использовать динамический массив. В этом случае вместо:
C
1
int arr[size];
используйте
C
1
int * arr;
0
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 10:48  [ТС] #3
Я знаю как объявлять динамические массивы. В данном случае понять почему данный код компилируется без ошибок при статическом массиве.
0
Пупкин Саша
0 / 0 / 0
Регистрация: 21.08.2016
Сообщений: 5
21.08.2016, 10:48 #4
Размер статического массива должен быть константой!!! например
C
1
2
const int size = 5;
int arr[size]
0
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 10:49  [ТС] #5
Знаю. Обычно без указания "const" вылетала ошибка во время компиляции. Но сейчас почему-то не вылетает, и приведеный мной код работает будто это динамический массив.
0
Пупкин Саша
0 / 0 / 0
Регистрация: 21.08.2016
Сообщений: 5
21.08.2016, 10:50 #6
А какой у вас компилятор?
0
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 10:52  [ТС] #7
MinGW. Пишу в Qt Creator
0
Пупкин Саша
0 / 0 / 0
Регистрация: 21.08.2016
Сообщений: 5
21.08.2016, 10:53 #8
Странно ... Может прога парсит?
0
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 10:55  [ТС] #9
Сначала я думал что при компиляции подставляется адекватное значение. Явно задал свое, и все равно успешная компиляция.
C++
1
2
3
4
int size = -1;
    int arr[size];
 
    arr[0] = 10;
Иронично. Обычно люди пытаются добиться успешной компиляции, а тут хочешь сломать, и безуспешно)
0
Пупкин Саша
0 / 0 / 0
Регистрация: 21.08.2016
Сообщений: 5
21.08.2016, 10:59 #10
Память выделяется на <size> элементов массива. А так простой динамический массив...
0
HelicopterK52
780 / 210 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
21.08.2016, 11:01 #11
Цитата Сообщение от Влад Колодка Посмотреть сообщение
В данном случае понять почему данный код компилируется без ошибок при статическом массиве
C++
1
2
3
    int size;
    cin >> size; 
    int arr[size];
Это вообще не будет компилироваться в соответствии со стандартом (можете добавить ключик -pedantic-errors)
Это нестандартное расширение от GCC VLA
1
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 11:01  [ТС] #12
Так если у меня задан размер "-1", размер массива же в принципе не может быть отрицательным. Но компилятор не ругается
0
hoggy
Заблокирован
21.08.2016, 11:03 #13
Лучший ответ Сообщение было отмечено Влад Колодка как решение

Решение

Цитата Сообщение от Влад Колодка Посмотреть сообщение
этот код КОМПИЛИРУЕТСЯ
вероятно вы выполняете сборку руками gcc ( или mingw, который на самом деле только пользует gcc).

gcc в качестве нестандартного расширения позволяет использовать variable length array
https://habrahabr.ru/post/195148/


по поводу циферки -1 см. документацию языка си.
1
HelicopterK52
780 / 210 / 32
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
21.08.2016, 11:04 #14
Цитата Сообщение от Влад Колодка Посмотреть сообщение
Но компилятор не ругается
С чего он должен ругаться, если значение Вы задаете в рантайме?
0
Влад Колодка
0 / 0 / 4
Регистрация: 10.11.2013
Сообщений: 29
21.08.2016, 11:53  [ТС] #15
В рантайме при "-1" тоже не вылетает ошибок.

Добавлено через 28 секунд
Спасибо
0
21.08.2016, 11:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2016, 11:53
Привет! Вот еще темы с решениями:

почему не компилируется ?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include...

Почему не компилируется?
Добрый день! Почему не компилируется данная программа. Хотелось бы чтобы из...

Почему не компилируется
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

ааааааааааааааааа, почему не компилируется?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include &lt;cmath&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru