Форум программистов, компьютерный форум CyberForum.ru

Размер статического массива - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.11.2012, 20:45     Размер статического массива #1
Можно ли задавть размер статического массива во время работы программы? Если нет, то почему?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main()
{
    int m;
    cin >> m;
    int arr[m];
    
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 20:45     Размер статического массива
Посмотрите здесь:

Автоматическое заполнение статического массива C++
Максимальная размерность статического массива C++
Инициализация статического массива C++
C++ Перевод из статического массива в динамический. (двумерный)
C++ Очередь на основе статического массива
Стек на основе статического массива C++
Стек на базе статического массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 21:58     Размер статического массива #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно, но только в Си, а не в Си++, и размер должен быть известен до исполнения любого кода функцией. Это называется variable-length array (VLA). То есть с
C
1
2
3
4
void func(unsigned n)
{
    int array[n];
}
проблем никаких нет. Но вот ввести число и выделить массив в одной и той же функции не получится.

Такое ограничение, потому что память под локальные переменные функции (и статические массивы в том числе) выделяется на стеке, так что их размер должен быть известен заранее перед вызовом функции. Очевидно, то, что там введёт пользователь во время выполнения функции, нельзя узнать перед вызовом функции. Тем не менее, VLA не обязательно создаются на стеке, но это возможный вариант реализации, поэтому на всякий случай такое ограничение.

Ещё раз: это фишка Си. Некоторые компиляторы Си++ могут поддерживать VLA, но стандартом это не требуется и это исключительно произвол gcc их фишечки.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.11.2012, 22:56  [ТС]     Размер статического массива #3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
но стандартом это не требуется
Но разрешается? Решают разработчики?
И вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
    int m = 10;
    int arr[m];
    
    return 0;
}
В литератуте пишут, что размер статического массива должен быть константой. С эти как дело обстоит?

Добавлено через 8 минут
И что можете по поводу этого сказать? Порекомендуйте компилятор
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 23:08     Размер статического массива #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Но разрешается? Решают разработчики?
Не запрещается. Решают разработчики компиляторов.

Цитата Сообщение от alsav22 Посмотреть сообщение
И вот такой код:
В литератуте пишут, что размер статического массива должен быть константой. С эти как дело обстоит?
Всё окей с этим. Размер константный. Было 10, значит 10. То же самое при вызове функции: какое число было передано при вызове, столько и выделилось. Что там с той переменной будет дальше — не важно.

Цитата Сообщение от alsav22 Посмотреть сообщение
И что можете по поводу этого сказать?
А что говорить? Место под все локальные переменные выделяется перед выполнением кода функции. Сколько этого места понадобится и когда его инициализировать, решает компилятор. Естественно, для него нет особых проблем выделить не фиксированное количество, а вытянуть размер из ячейки памяти.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
30.11.2012, 23:28     Размер статического массива #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А что говорить? Место под все локальные переменные выделяется перед выполнением кода функции.
конечно нет
Порекомендуйте компилятор
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.11.2012, 23:39  [ТС]     Размер статического массива #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё окей с этим. Размер константный.
То, что этот код Студия отказывается компилировать - это причуды Студии? Со стороны стандарта к этому коду претензий нет?
И по поводу кода из первого поста. Что можно однозначно (если можно однозначно) сказать? Для С правильный, для С++ неправильный? Или вообще неправильный? С точки зрения стандарта неправильный? В зависимости от компилятора? Для одного компилятора правильный, для другого неправильный? Лучше так не далать? Или что?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
01.12.2012, 00:05     Размер статического массива #7
Цитата Сообщение от alsav22 Посмотреть сообщение
И по поводу кода из первого поста
Сам задумался. Чёрт его знает что тут можно сказать, компилятор у меня не старый. Однозначно наверное так: используй днамические массивы для такого дела, не ошибёшься.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.12.2012, 00:06     Размер статического массива #8
Цитата Сообщение от alsav22 Посмотреть сообщение
То, что этот код Студия отказывается компилировать - это причуды Студии? Со стороны стандарта к этому коду претензий нет?
Со стороны стандарта C99/C11 нет. Студия этот стандарт языка Си не поддерживает.

Цитата Сообщение от alsav22 Посмотреть сообщение
Для С правильный, для С++ неправильный? Или вообще неправильный? С точки зрения стандарта неправильный? В зависимости от компилятора? Для одного компилятора правильный, для другого неправильный? Лучше так не далать? Или что?
Нет. Да. Да. Нет. Нет. Да.
Если вы хотите массив динамического размера, new[] вам в руки.
__Александр__
7 / 10 / 0
Регистрация: 17.09.2012
Сообщений: 191
Записей в блоге: 2
01.12.2012, 00:24     Размер статического массива #9
статически массив...
в самом вопросе уже есть 80% ответа: static -то есть константа. Если был определен массив (пример: char a[5] ), то размер массива не будет превышать значение указанное в " [] ", в этом случае 5 и не более.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
01.12.2012, 00:36     Размер статического массива #10
Александр, ты хоть в вопрос-то вникни, static это не константа, константа это const; потом тут нигде не обсуждается спецификатор static; тут слово "статический" употребляется в значении "нединамический". То есть идёт обсуждение двух массивов, память под которого выделяется так: new и по-другому. Второй вариант судьбы он назван статическим. Но спецификатор static тут ни к селу ни к городу.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,912
Записей в блоге: 1
01.12.2012, 00:49     Размер статического массива #11
Цитата Сообщение от kravam Посмотреть сообщение
Александр, ты хоть в вопрос-то вникни
А ты тоже в язык вникни... в английский Мы тут не про программирование говорим.
Потому что он прав. static array это значит недвижимый, всегда известного размера
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2012, 01:01  [ТС]     Размер статического массива #12
Цитата Сообщение от kravam Посмотреть сообщение
Однозначно наверное так: используй днамические массивы для такого дела, не ошибёшься.
Это то понятно. Вопрос про статические.

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Сообщение от alsav22
Для С правильный, для С++ неправильный? Или вообще неправильный? С точки зрения стандарта неправильный? В зависимости от компилятора? Для одного компилятора правильный, для другого неправильный? Лучше так не далать? Или что?
Нет. Да. Да. Нет. Нет. Да.
Если вы хотите массив динамического размера, new[] вам в руки.
Из этого ответа следует, что компилятор Dev-C++ компилирует код не соответствующий стандарту? Что, наверное, имеет место быть и для других компиляторов (для той же Студии, но в других случаях).
А для правильной работы кода это имеет какое-нибудь значение? Или можно не обращать внимания, раз компилятор пропускает?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
01.12.2012, 01:04     Размер статического массива #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Мы тут не про программирование говорим.
естессно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 01:44     Размер статического массива
Еще ссылки по теме:

C++ Передача статического массива в функцию
C++ Из статического массива в динамический
C++ Очередь на основе динамического (статического) массива
Инициализация статического массива C++
C++ Обнуление статического массива

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.12.2012, 01:44     Размер статического массива #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Из этого ответа следует, что компилятор Dev-C++ компилирует код не соответствующий стандарту? Что, наверное, имеет место быть и для других компиляторов (для той же Студии, но в других случаях).
А для правильной работы кода это имеет какое-нибудь значение? Или можно не обращать внимания, раз компилятор пропускает?
Не соответствует в том плане, что стандарт ничего об этом не говорит. Массив может как создаться, так и создаться какого-то рандомного размера, так и создаться такого размера, что был считан, но в динамической памяти. Это стандартом не регламентируется.

У меня на gcc этот код тоже собирается. И массив выделяется того размера, как был считан. И на стеке, а не в куче. Но это произвол лично gcc. Про Студию ничего не могу сказать, но она не будет нарушать стандарт, если выругается ошибкой компиляции.
Yandex
Объявления
01.12.2012, 01:44     Размер статического массива
Ответ Создать тему
Опции темы

Текущее время: 12:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru