Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 121

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

12.06.2014, 20:26. Показов 3300. Ответов 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,542
Записей в блоге: 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,542
Записей в блоге: 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,038
Записей в блоге: 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,038
Записей в блоге: 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,542
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru