Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
1

Динамический и статический массив

27.04.2016, 21:27. Просмотров 885. Ответов 9
Метки нет (Все метки)

Подскажите, в чем разница.
Имеется статический массив, который просто задается:
C++
1
long mas[5] = { 0 };
Т.е. просто вставляем массив размером 5, который заполнен нулями.
В чем отличие этого массива от:
C++
1
2
3
4
5
int n;
cout << "Enter n : \n";
cin >> n;
long *mas = new long[n];
mas = { 0 };
Дальше идет:
C++
1
long  lSize = sizeof(mas) / sizeof(mas[0]);
Может быть тут проблема? Просто дальше при заполнении этого самого mas используется размер, который получаем по вышеуказанному методу, и именно после того как вписали 1ый символ, вылезает ошибка "string subscript out of range"
Со статическим никаких проблем. Где и что менять?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2016, 21:27
Ответы с готовыми решениями:

Переделать статический массив в динамический
Помогите переделать статический массив в динамический #include &lt;stdio.h&gt;...

Переделать статический массив в динамический
Помогите пожалуйста переделать статический массив в динамический #include...

Переделать статический массив в динамический
Помогите переделать статический массив в динамический. #include &lt;iostream&gt;...

Двумерный массив (поменять статический массив на динамический)
Нужно поменять статический массив на динамический с выделением памяти ...

Заменить в программе статический массив на динамический
Программа работает, но теперь нужно привести ее к виду, в котором участвует уже...

9
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
27.04.2016, 23:11 2
Цитата Сообщение от Lemanos Посмотреть сообщение
long *lSize = sizeof(mas) / sizeof(mas[0]);
замени эту строчку на
C++
1
long  lSize = n * sizeof(long) / sizeof(long);
и проблем быть не должно(просто, если я правильно понял - sizeof() расчитывается на этапе компиляции, а пока не введешь n невозможно узнать размер твоего массива)

Добавлено через 4 минуты
хм, и получим n, чет я не понял тогда, ты хотел размер динамического массива узнать? тогда сохраняй свой n - он и есть размер
0
hoggy
Нарушитель
Эксперт С++
7088 / 3131 / 648
Регистрация: 15.11.2014
Сообщений: 7,211
Завершенные тесты: 1
27.04.2016, 23:12 3
Цитата Сообщение от Lemanos Посмотреть сообщение
Может быть тут проблема?
огаа

Цитата Сообщение от Lemanos Посмотреть сообщение
Где и что менять?
C++
1
long  lSize = n;
Добавлено через 54 секунды
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
тогда сохраняй свой n - он и есть размер
бинго!
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
27.04.2016, 23:15 4
кстате - вот это -
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
sizeof(mas)
= разрядности операционной системы

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
бинго!
не бинго
Цитата Сообщение от Lemanos Посмотреть сообщение
sizeof(mas) / sizeof(mas[0]);
размер указателя разделить на размер элемента
0
nonedark2008
1069 / 800 / 225
Регистрация: 28.07.2012
Сообщений: 2,218
27.04.2016, 23:20 5
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
= разрядности операционной системы
С чего бы это? У меня вот спокойно под моей x64 ОС размер указателя 4 байта вместо обещанных 8 байт.
Тем более в случае long mas[5] = { 0 }; там будет именно что размер массива в байтах.
0
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
27.04.2016, 23:26  [ТС] 6
Stitch Igorek,
Вы наверно в скобках (mas) имели ввиду?
Сейчас не вылезает окно ошибки "string subscript out of range", но на том же месте вылезает "прекращена работа программы..."

Добавлено через 1 минуту
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
хм, и получим n, чет я не понял тогда, ты хотел размер динамического массива узнать? тогда сохраняй свой n - он и есть размер
Так уже пробовал. Программа не идет дальше.
Часть "sizeof(mas) / sizeof(mas[0])" ведь не равна sizeof/sizeof, вот в чем дело.
0
hoggy
Нарушитель
Эксперт С++
7088 / 3131 / 648
Регистрация: 15.11.2014
Сообщений: 7,211
Завершенные тесты: 1
27.04.2016, 23:30 7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Тем более в случае long mas[5] = { 0 }; там будет именно что размер массива в байтах.
количество элементов, однако.
0
Lemanos
13 / 13 / 8
Регистрация: 02.04.2016
Сообщений: 106
28.04.2016, 07:46  [ТС] 8
Ошибка из-за разных версий VS или "Как вытащить работающий код из проекта"
Вот тут я выкладывал исходник. Из того кожа брал части, которые мне нужны были. Если это поможет расследованию. Мне надо, чтобы длина ключа задавала с клавиатуры, а не менялась в коде вручную. При изменении все равно все хорошо работает
И при n=5, и 6, и 7, и вообще при всеХ значениях. Поэтому надо это сделать именно как ввод.

Добавлено через 8 часов 6 минут
В итоге.
Решил при разных значениях длин вывести значения этого lSize. И это значение = длине. В итоге просто вместо функции sizeof(mas) / sizeof(mas[0]) написал =n. Теперь Динамический массив нормально обрабатывается дальше.

В общем. Я получил то, что хотел. Но все же не понятно, что именно делала
C++
1
long  lSize = sizeof(mas) / sizeof(mas[0]);
Если кто-то может внятно объяснить, большое спасибо.
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
28.04.2016, 10:33 9
Лучший ответ Сообщение было отмечено Lemanos как решение

Решение

Цитата Сообщение от Lemanos Посмотреть сообщение
Но все же не понятно, что именно делала

C++
1
long *lSize = sizeof(mas) / sizeof(mas[0]);
mas - это указатель на первый элемент массива - это видно из этой строчки
Цитата Сообщение от Lemanos Посмотреть сообщение
long *mas = new long[n];
mas[0] - это это переменная на которую ссылается указатель mas - эта запись эквивалентна *mas
следовательно
sizeof(mas) / sizeof(*mas) - получаем, что мы размер указателя делим на размер переменной, на которую ссылается указатель

Добавлено через 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const int size = 10;
    int static_arr[size];               //создаем статический массив размером size
    int *dinamic_arr = new int[size];   //создаем динамический массив размером size
 
    std::cout << sizeof(static_arr) << std::endl;   //тут компилятор знает сколько памяти выделено под массив
    std::cout << sizeof(&static_arr) << std::endl;  //тут компилятор вычисляет размер указателя на статический массив
    std::cout << sizeof(*static_arr) << std::endl;  //тут компилятор определяет размер одной ячейки массива
    std::cout << sizeof(dinamic_arr) << std::endl;  //тут компилятор знает только сколько весит сам указатель
    std::cout << sizeof(&dinamic_arr) << std::endl; //поэтому эти 2 записи дают один результат
    std::cout << sizeof(*dinamic_arr) << std::endl; //тут компилятор вычисляет размер одного элемента массива
 
    system("pause");
    return 0;
}
1
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
28.04.2016, 10:36 10
Лучший ответ Сообщение было отмечено Lemanos как решение

Решение

Невозможно получить размер динамического массива через sizeof. Да и вообще никак, надо просто запоминать какой размер мы в new указывали
1
28.04.2016, 10:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2016, 10:36

Как перевести статический массив в динамический?
Есть статический массив типа char,подскажите как перевести его в динамический и...

Переделать статический массив структур в динамический
Имею структуру из 8 эл-ов (массивов чаров и 2 подструктуры). Имею исходные...

Нужно переделать статический массив в динамический
Помогите пожалуйста! Нужно переделать статический массив в динамический. ...


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

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

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