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

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

10.01.2014, 21:36. Показов 2918. Ответов 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
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru