6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121

Выделение динамической памяти

12.06.2014, 20:26. Показов 3340. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чем
C++
1
2
    int *List = new int[10];
delete [] List;
отличается от обычного массива (int List[10]) ?

Нет, я понимаю, что создал динамическую переменную. Но ведь выделяется память на десять элементов как и в обычном массиве. Тогда зачем он нам нужен ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2014, 20:26
Ответы с готовыми решениями:

Выделение динамической памяти
Добрый вечер. Помогите разобраться пожалуйста! Суть такова: есть файл, в нем есть данные, мне надо их оттуда считать и вывести на...

Выделение динамической памяти C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод,...

Выделение динамической памяти
Программа не выполняется до конца. В чем проблема? Подскажите, пожалуйста Ход выполнения программы: ...

38
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 1
13.06.2014, 11:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Faoxis Посмотреть сообщение
var -> lst = 3; // Вот оператор "->". Пока не понятно, что происходит здесь
то же самое, что и
C++
1
 (*var).lst=3
теперь понятно?
1
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121
13.06.2014, 11:41  [ТС]
Да, так лучше, но не до конца понятно, что происходит )
0
13.06.2014, 11:43

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
теперь понятно?
- Папа, а как выглядит цифра "8"?
- Как "бесконечность", повернутая на пи-пополам.

0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
13.06.2014, 11:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
    List *var = NULL; - Объявление указателя на объект класса List
    var = new List; // А почему не указываем размер ? Например, как var = new List[size]
 
Потому что создается один объект списка, а не массив.
 
     var -> lst = 3; // Вот оператор "->". Пока не понятно, что происходит здесь
 
Присвоение значения элементу lst объекта, адрес которого находится в переменной var
 
    var -> next = NULL; // и здесь
 
Для односвязного списка next должен быть адрес следующего элемента, поскольку следующего элемента нет, адрес зануляется.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 1
13.06.2014, 11:56
Tulosba, к чему ирония? оператолры в Си проходят именно в таком порядке.
Сначала изучают указатели и оператор * для них
Потом структуры и оператор . для них
и лишь потом совмещают эти знания и изучают оператор ->
А как иначе объяснишь? Вот если автор знаком с указателями и структурами, он меня поймёт.
А твоя аналогия неверна, потому что сначала изучают цифру 8, а потом уже бесконечность и пи.
1
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121
13.06.2014, 13:02  [ТС]
Разбираю код примера и тут такая ерунда:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  void Add_Beg(List **u, int &x) // Что значит ** перед u ?
 
{
 
   List *t = new List;
 
   t -> lst = x;
 
   t->next = *u;
 
   *u = t;
 
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2014, 13:22
Цитата Сообщение от Faoxis Посмотреть сообщение
Что значит ** перед u
Указатель на указатель.
1
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121
13.06.2014, 13:25  [ТС]
Адрес адреса переменной ? Мне это представляется как смерть после смерти в загробном мире. ))
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,042
Записей в блоге: 1
13.06.2014, 13:32
Цитата Сообщение от Faoxis Посмотреть сообщение
Мне это представляется как смерть после смерти
скорее смерть для смерти
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2014, 13:32
Цитата Сообщение от Faoxis Посмотреть сообщение
Адрес адреса переменной ?
Почти.
C++
1
2
3
4
int i = 42; // переменная целого типа. Хранит значение 42.
int* p = &i; // указатель на целое. Хранит адрес переменной i.
int** pp = &p; // указатель на указатель на целое. Хранит адрес переменной p.
// можно продолжить :)
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,042
Записей в блоге: 1
13.06.2014, 15:58
Цитата Сообщение от Renji Посмотреть сообщение
C99 позволяет динамические массивы на стеке. И компиляторы которые в C++11 поддерживают фишки C99.
Добавили в стандарт C++14
0
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121
13.06.2014, 16:33  [ТС]
А еще вот такой вопрос о теории.

C++
1
2
3
4
5
6
 struct List
{
   int lst;
   List *next; // Возникается ошибка если написать List next; Почему ? Зачем надо ссылаться на структуру, 
                   //а не использовать прямой доступ к ней ?
};
Еще хотел бы сказать большое спасибо всем кто помогает. Спасибо!)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.06.2014, 16:36
Возникается ошибка если написать List next; Почему ?
Потому что надо понимать тонкую разницу между List next и List&next. Первое это "создайте мне удава, который проглотил удава, который проглотил удава, который...".
0
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121
13.06.2014, 16:38  [ТС]
А второе тогда "создайте мне удава, который МОЖЕТ проглотить удава, который МОЖЕТ проглотить удава" ?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
13.06.2014, 16:45
Второе это "создайте мне удава который знает удава по кличке next". Клички менять нельзя, next всегда будет одним и тем же удавом. А вот чтобы кличка могла меняться и могла быть пустой, как раз и нужен list*.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2014, 19:08
Цитата Сообщение от Croessmah Посмотреть сообщение
Добавили в стандарт C++14
На самом деле уже нет. http://www.open-std.org/jtc1/s... /n3875.pdf
Пункт 2.
0
1 / 1 / 1
Регистрация: 04.02.2014
Сообщений: 13
14.10.2014, 14:40
Всем привет. Новую тему решил не создавать.
Пытался загрузить двумерный массив из файла, чтобы потом работать с ним. Файл - txt c определенным количеством строк и столбцов, числа разделены пробелами.
Делал двумя способами (ниже показаны), но в обоих случаях появлялась stack overflow.
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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
ifstream in("data.txt");
    if (!in)
    {
        cout << "File not found\n";
        _getch();
        return 1;
    }
 
    double data[2592][801];
    for (int i = 0; i < 2592; i++) {
        for (int j = 0; j < 801; j++) {
            in >> data[i][j];
        }
        cout << '\n';
    }
        system("pause");
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
std::ifstream is("data.txt");
    vector<double> values((istream_iterator<double>(is)),
        istream_iterator<double>());
    for (auto v : values)
        cout << v << endl; // вектор значений из матрицы
 
    double data[2592][801];
    for (size_t i = 0, k = 0; i < 2592; ++i)
    for (size_t j = 0; j < 801; ++j)
        data[i][j] = values[k++]
        system("pause");
    return 0;
}
Когда размер массива намного меньше, все операции, которые я провожу с data[][] проходят прекрасно.
Далее в properties изменял размер стека, но бесполезно, все равно overflow.
Поэтому переключился на динамическую память.
По примеру из этой темы Выделение динамической памяти для двумерного массива. сделал вот что:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <iterator>
using namespace std;
 
int main()
{
    ifstream in("data.txt");
    if (!in)
    {
        cout << "File not found\n";
        _getch();
        return 1;
    }
 
    int x = 2592; // количество строк
    int y = 800; // количество столбцов
 
    // выделение памяти
    double **data = new double *[x];
    for (int i = 0; i < x; i++)
    {
        data[i] = new double[y];
    }
    
    // из файла
    for (int i = 0; i < x; i++) 
    {
        for (int j = 0; j < y; j++) 
        {
            in >> data[i][j];
            //cout << data[i][j];
        }
        cout << '\n';
    }
 
    cout << data[3][4];
 
    // освобождение памяти
    for (int i = 0; i < x; i++)
    {
        delete[]data[i];
    }
    delete[]data;
 
    
 
    system("pause");
    return 0;
}
Проблема с переполнением решилась. Но теперь хочу поработать с самим созданным массивом data. Самое простейшее - например, вывести cout << data[3][4] (что есть в коде), но ничего не происходит. Нету возможности проводить хоть какие-то действия с data[][]. Короче бьюсь уже второй день. Наверняка я туплю, но буду рад помощи. Если есть какой-то другой способ, то тоже хорошо.

Добавлено через 3 часа 13 минут
На всякий случай отвечаю самому себе и кому интересно. Последний вариант с выделением памяти рабочий, делать всякие штуки с массивом тоже можно, просто нужно было подождать секунд 10-15 пока выполнятся два цикла. Тупанул.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,544
Записей в блоге: 1
14.10.2014, 15:29
Bellamy, а ты специально на стеке массив выделял?
почему не так?
C++
1
2
3
4
5
6
7
8
double data[2592][801];
int main()
{
std::ifstream is("data.txt");
    vector<double> values((istream_iterator<double>(is)),
        istream_iterator<double>());
    for (auto v : values)
        cout << v << endl; // вектор значений из матрицы
1
1 / 1 / 1
Регистрация: 04.02.2014
Сообщений: 13
14.10.2014, 15:42
Kuzia domovenok, не специально.
Работает, спасибо большое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.10.2014, 15:42

выделение динамической памяти
помогите пожалуйста , нужно написать функцию для ввода новой матрицы, не получается выделить под него память. класс: mymatrix ::...

Выделение динамической памяти
Доброго времени суток! Возник такой вопрос, переделываю программу, где параметры матрицы задавались константами на выделение динамический...

Выделение динамической памяти
Ситуация заключается в следующем я выделил память под двумерный массив, но получилось так что мне нужно выделить еще память ...

Выделение динамической памяти
Всем доброго времени суток. Прошу помочь с задачей. Задача решена, просто нужно переделать её с выделением динамической памяти. ...

Выделение динамической памяти
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...


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

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

Новые блоги и статьи
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru