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

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

10.01.2014, 21:36. Показов 2854. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru