Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для casper007
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420

Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение?

10.01.2014, 21:36. Показов 2761. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
int k;
int mass[k];//к-еще не инициализирован, и поэтому выводится ошибка, а менять значение нельзя
Очевидно, что нужен указатель. Но как это реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2014, 21:36
Ответы с готовыми решениями:

Как создать массив, размерность которого будет рандомная
Всем привет, подскажите как создать массив, размерность которого будет рандомная, то есть количество строк и столбцов заранее не известно а...

Как объявить массив, размерность которого заранее не известна
как определить массив если мы не знаем сколько элементов в нем будет? Заголовок продумываем

Как создать трехмерный массив, размерность которого задается с клавиатуры?
Visual Studio требует константы, и если я хочу вводить размерность с клавиатуры, то надо динамично выделять память. Как это реализовать для...

23
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 21:44
C++
1
2
3
4
5
6
int *p;
int n;
cin >> n;
p = new int[n];
...
delete []p;
1
 Аватар для casper007
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420
10.01.2014, 21:57  [ТС]
А если работать с классами?
TCLASS KLASS[n];
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 21:59
Цитата Сообщение от casper007 Посмотреть сообщение
А если работать с классами?
TCLASS KLASS[n];
Абсолютно так же
C++
1
2
3
4
5
6
TCLASS *p;
int n;
cin >> n;
p = new TCLASS[n];
...
delete []p;
Если надо массив указателей на экземпляры класса, то так
C++
1
2
3
4
5
6
7
TCLASS **p;
int n;
cin >> n;
p = new TCLASS*[n];
p[0] = new TCLASS();//etc
...
delete []p;
1
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 22:06
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    int N;//размер массива
    int *ptrArr;//указатель массива
 
    cout << "input num of array: ";
 
    scanf("%d", &N);
 
    ptrArr = new int[N];
 
    cout << ptrArr[0] << endl;
 
    delete ptrArr;
    
    return 0;
}
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
10.01.2014, 22:17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Example
 {   
 public:     
     Example()
     {       
         id = count++;       
         cout<<"Create a new Example class - "<<id<<endl;
     }
     ~Example()
     {
         cout<<"Delte Example class - "<<id<<endl;
     }       
 private:
     static int count;
     int id;
 };
 
 int Example::count = 1;
 
void _tmain(int argc, _TCHAR* argv[])
{
    int size;   
    Example * arr_example;
 
    cout<<"Input array size:"; cin>>size;  
 
    arr_example = new Example[size];
    //some to do
    delete[] arr_example;
    getchar();
    getchar();
}
1
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:32
Цитата Сообщение от ilja123 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    int N;//размер массива
    int *ptrArr;//указатель массива
 
    cout << "input num of array: ";
 
    scanf("%d", &N);
 
    ptrArr = new int[N];
 
    cout << ptrArr[0] << endl;
 
    delete ptrArr;
    
    return 0;
}
Это неверно
delete ptrArr;
Надо
delete []ptrArr;
1
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 22:49
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
Это неверно
Как проверить??

Добавлено через 5 минут
Я думаю просто delete это язык Си Delete[] это язык С++ Но, как всегда в Сях пофиХ кто как хочет так и....
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:50
Цитата Сообщение от ilja123 Посмотреть сообщение
Как проверить??
Никак. Компилятор ругаться не будет. Он не будет ругаться, если эту строку убрать вовсе. Но память освобождается неверно(верно только, если N=1).
C++
1
delete p;
- здесь освобождается только память, выделенная под первый элемент
C++
1
delete []p;
- так освобождается память, занятая под массив
Я думаю просто delete это язык Си Delete[] это язык С++ Но, как всегда в Сях пофиХ кто как хочет так и....
Нет. Если я не ошибаюсь, то в Си вообще нету такого оператора, а память выделяется с помощью malloc и освобождается с помощью free
0
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 22:52
ну я в нете видел и такое
C++
1
2
for(i=0; i<=N; i++)
         delete p[i];
Хде правду искать???
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:58
Цитата Сообщение от ilja123 Посмотреть сообщение
ну я в нете видел и такое
C++
1
2
for(i=0; i<=N; i++)
         delete p[i];
Хде правду искать???
Здесь двумерный массив. И освобождается память тоже неверно, надо так
C++
1
2
3
4
5
6
7
8
9
int **p;
//выделение памяти
p = new int*[5];
for(int i = 0; i < 5; i++)
     p[i] = new int[5];
//освобождение памяти
for(int i = 0; i < 5; i++)
     delete []p[i];
delete []p;
1
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 22:59
Может вообще p[] = NULL Чтоб уж наверняка Контролльный так сказать
1
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 23:05
Цитата Сообщение от ilja123 Посмотреть сообщение
Может вообще p[] = NULL Чтоб уж наверняка Контролльный так сказать
Скорее так)
C++
1
p = nullptr;
Это необязательно, нужно лишь для того, чтобы при попытке использовать этот указатель после того, как память была освобождена, выскочило NullReferenceException.
Иначе, будет использоваться не инициализированный участок памяти и поведение программы предсказать не выйдет.
2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
10.01.2014, 23:15
а че никто вектора не предлагает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
 
int main()
{
  int width = 10;
  int height = 20;
 
  std::vector<int> v(width);
 
  // двумерный
  std::vector< std::vector<int> > v2(height, std::vector<int>(width));
 
  //...
 
  // не надо никаких delete []. все сделается автоматом.
 
  return 0;
}
1
 Аватар для casper007
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420
10.01.2014, 23:18  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
а че никто вектора не предлагает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
 
int main()
{
  int width = 10;
  int height = 20;
 
  std::vector<int> v(width);
 
  // двумерный
  std::vector< std::vector<int> > v2(height, std::vector<int>(width));
 
  //...
 
  // не надо никаких delete []. все сделается автоматом.
 
  return 0;
}
Спасибо! Возьму на заметку.
0
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 23:25
Ну типа вектора это для слабакоФ, а настоящие прогеры юзают чистые указатели

Добавлено через 1 минуту
А вообще Вектора - лучший выбор ИМХО :black_eye.:
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
10.01.2014, 23:33
Цитата Сообщение от ilja123 Посмотреть сообщение
ну я в нете видел и такое
Код C++
1
2
for(i=0; i<=N; i++)
delete p[i];
тоже верно.

Цитата Сообщение от ilja123 Посмотреть сообщение
Хде правду искать???
Просто усвойте, что некоторые вещи можно делать по-разному
0
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
10.01.2014, 23:35
Цитата Сообщение от some_name Посмотреть сообщение
Просто усвойте, что некоторые вещи можно делать по-разному
(камнями не бейте) но это недостаток языка
0
162 / 162 / 42
Регистрация: 29.05.2010
Сообщений: 435
11.01.2014, 00:01
Цитата Сообщение от some_name Посмотреть сообщение
тоже верно.
Нет, это называется неопределенное поведение. Попробуйте запустить программу с delete[] и с delete

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
 
class MyClass
{
public:
    MyClass() {}
    ~MyClass()
    {
        std::cout << "Destructor: " << std::endl;
    }
};
 
int main()
{
    MyClass *p = new MyClass[2];
    delete []p;//попробуйте запустить без []
    system("pause");
    return 0;
}
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
11.01.2014, 00:30
AnDrew_LP, вы правы, я сглупил.

Ведь массив это занимает цельный блок памяти и если нам будет позволено делать что-то типа:
C++
1
delete arr[i];
то мы "разорвем массив", а это уже серьезный косяк.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2014, 00:30
Помогаю со студенческими работами здесь

Как сделать так,чтобы размерность массива вводил пользователь и массив заполнялся случайными числами?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;stdlib.h&gt; using namespace std; void mas(int a) //вывод...

Как можно программно, после запуска программы, переместить окно программы на определенные координаты?
Как можно программно, после запуска программы, переместить окно программы на определенные координаты?

Определить, как изменится массив после работы программы
Написать программы: 1) В программе описан одномерный целочисленный массив с индексами от 0 до 10. В приведенном ниже фрагменте программы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru