Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
12.06.2014, 20:26     Выделение динамической памяти #1
Чем
C++
1
2
    int *List = new int[10];
delete [] List;
отличается от обычного массива (int List[10]) ?

Нет, я понимаю, что создал динамическую переменную. Но ведь выделяется память на десять элементов как и в обычном массиве. Тогда зачем он нам нужен ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 20:26     Выделение динамической памяти
Посмотрите здесь:

C++ матрица, выделение динамической памяти...
C++ Выделение динамической памяти
Выделение динамической памяти C++ C++
C++ выделение динамической памяти
Выделение динамической памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.06.2014, 11:37     Выделение динамической памяти #21
Цитата Сообщение от Faoxis Посмотреть сообщение
var -> lst = 3; // Вот оператор "->". Пока не понятно, что происходит здесь
то же самое, что и
C++
1
 (*var).lst=3
теперь понятно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
13.06.2014, 11:41  [ТС]     Выделение динамической памяти #22
Да, так лучше, но не до конца понятно, что происходит )
Tulosba
13.06.2014, 11:43
  #23

Не по теме:

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

uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
13.06.2014, 11:48     Выделение динамической памяти #24
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 должен быть адрес следующего элемента, поскольку следующего элемента нет, адрес зануляется.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.06.2014, 11:56     Выделение динамической памяти #25
Tulosba, к чему ирония? оператолры в Си проходят именно в таком порядке.
Сначала изучают указатели и оператор * для них
Потом структуры и оператор . для них
и лишь потом совмещают эти знания и изучают оператор ->
А как иначе объяснишь? Вот если автор знаком с указателями и структурами, он меня поймёт.
А твоя аналогия неверна, потому что сначала изучают цифру 8, а потом уже бесконечность и пи.
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
13.06.2014, 13:02  [ТС]     Выделение динамической памяти #26
Разбираю код примера и тут такая ерунда:

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;
 
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.06.2014, 13:22     Выделение динамической памяти #27
Цитата Сообщение от Faoxis Посмотреть сообщение
Что значит ** перед u
Указатель на указатель.
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
13.06.2014, 13:25  [ТС]     Выделение динамической памяти #28
Адрес адреса переменной ? Мне это представляется как смерть после смерти в загробном мире. ))
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,863
Записей в блоге: 2
Завершенные тесты: 1
13.06.2014, 13:32     Выделение динамической памяти #29
Цитата Сообщение от Faoxis Посмотреть сообщение
Мне это представляется как смерть после смерти
скорее смерть для смерти
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.06.2014, 13:32     Выделение динамической памяти #30
Цитата Сообщение от Faoxis Посмотреть сообщение
Адрес адреса переменной ?
Почти.
C++
1
2
3
4
int i = 42; // переменная целого типа. Хранит значение 42.
int* p = &i; // указатель на целое. Хранит адрес переменной i.
int** pp = &p; // указатель на указатель на целое. Хранит адрес переменной p.
// можно продолжить :)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,863
Записей в блоге: 2
Завершенные тесты: 1
13.06.2014, 15:58     Выделение динамической памяти #31
Цитата Сообщение от Renji Посмотреть сообщение
C99 позволяет динамические массивы на стеке. И компиляторы которые в C++11 поддерживают фишки C99.
Добавили в стандарт C++14
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
13.06.2014, 16:33  [ТС]     Выделение динамической памяти #32
А еще вот такой вопрос о теории.

C++
1
2
3
4
5
6
 struct List
{
   int lst;
   List *next; // Возникается ошибка если написать List next; Почему ? Зачем надо ссылаться на структуру, 
                   //а не использовать прямой доступ к ней ?
};
Еще хотел бы сказать большое спасибо всем кто помогает. Спасибо!)
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,952
13.06.2014, 16:36     Выделение динамической памяти #33
Возникается ошибка если написать List next; Почему ?
Потому что надо понимать тонкую разницу между List next и List&next. Первое это "создайте мне удава, который проглотил удава, который проглотил удава, который...".
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
13.06.2014, 16:38  [ТС]     Выделение динамической памяти #34
А второе тогда "создайте мне удава, который МОЖЕТ проглотить удава, который МОЖЕТ проглотить удава" ?
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,952
13.06.2014, 16:45     Выделение динамической памяти #35
Второе это "создайте мне удава который знает удава по кличке next". Клички менять нельзя, next всегда будет одним и тем же удавом. А вот чтобы кличка могла меняться и могла быть пустой, как раз и нужен list*.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.06.2014, 19:08     Выделение динамической памяти #36
Цитата Сообщение от Croessmah Посмотреть сообщение
Добавили в стандарт C++14
На самом деле уже нет. http://www.open-std.org/jtc1/sc22/wg...2014/n3875.pdf
Пункт 2.
Bellamy
1 / 1 / 1
Регистрация: 04.02.2014
Сообщений: 13
14.10.2014, 14:40     Выделение динамической памяти #37
Всем привет. Новую тему решил не создавать.
Пытался загрузить двумерный массив из файла, чтобы потом работать с ним. Файл - 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 пока выполнятся два цикла. Тупанул.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.10.2014, 15:29     Выделение динамической памяти #38
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; // вектор значений из матрицы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2014, 15:42     Выделение динамической памяти
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Освобождение и выделение динамической памяти
Выделение динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
Bellamy
1 / 1 / 1
Регистрация: 04.02.2014
Сообщений: 13
14.10.2014, 15:42     Выделение динамической памяти #39
Kuzia domovenok, не специально.
Работает, спасибо большое.
Yandex
Объявления
14.10.2014, 15:42     Выделение динамической памяти
Ответ Создать тему
Опции темы

Текущее время: 14:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru