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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
Lindemann66
4 / 4 / 0
Регистрация: 28.04.2010
Сообщений: 162
#1

Отличие операции с выделением памяти и без - C++

09.08.2011, 16:05. Просмотров 3276. Ответов 60
Метки нет (Все метки)

Всем привет!

Не сочтите за глупость, но возник интересный вопрос, над которым давно думаю, а овтета нигде не находил

Вот нужно, допустим, создать массив из n элементов

Сделать это можно 2-мя способами


C++
1
int arr[n];

и
C++
1
int *arr = new int[n];
Но в одном случае создание массива сопровождается выделением памяти, а в другом - без
В чём принципиальная разница?
Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем
Понятно, так и делаем. А тут как правильней?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отличие операции с выделением памяти и без (C++):

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Конструктор с выделением памяти - C++
Среди всех данных есть указатель, память для которого выделяется в конструкторе, необходимый размер передается в параметрах конструктора....

Проблема с выделением памяти - C++
Всем привет! Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен...

Проблемы с выделением памяти - C++
Здравствуйте. Есть контейнер QList <Node *> В Node свой QList <Node *>. Строю программное дерево разбора выражение. На небольших...

Работа со строками и выделением памяти - C++
Задание написать класс строк (что-то типа String). #define MAX 100 class ascii { private: char* str; int len; ...

Задача на строки с выделением памяти - C++
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из заданного количества слов. Возвращает количество прочих...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
09.08.2011, 16:54 #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Это делается вот так
C++
1
2
3
char ** pArray = new char *[m];
for(int i = 0; i < m; i++)
pArray[i] = new char[n];
А как быть если в программе нужно изменить длинну какой-либо одной строки
C++
1
pArray[i]
лучше malloc с realloc использовать....
У меня был конкретный вопрос про выражение

C++
1
new char[n][m];
Вы его подменили другим выражением. Это как раз и подтверждает, что с массивами выделяемыми в куче работать сложнее. Что я и хотел сказать.
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
09.08.2011, 16:55 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
лучше malloc с realloc использовать....
Лучше std::vector<std::vector<int>> ипользовать, если пишешь на С++, выдержка стиля все-таки.
1
-=ЮрА=-
Заблокирован
Автор FAQ
09.08.2011, 16:57 #18
За указатель писал к тому что юзая функции мы всё равно в них указатели передаём, ну а на счёт sizeof - я предпочитаю этот дедовский способ, мне он интуитивно понятней...
На счёт передачи в sizeof динамики - вернётся 4
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
09.08.2011, 16:58 #19
Цитата Сообщение от Сыроежка Посмотреть сообщение
Кстати сказать, когда выделяется память в куче для двумерного массива, многие программисты затем испытывают трудности при работе с ним, потому что не знают, как затем обращаться с этим массивом, и как определить указатель на выделенную память.

Например, как правильно задать указатель для выделения памяти выражением вида

new char[m][n];

Здесь уже был такой вопрос на форуме.
В С++ НЕТ двумерных массивов - только одномерные. Поэтому указанная вами запись - невозможна. Однако элементом массива может быть массив. Поэтому тут все четко: сначала выделяем память под массив (указателей), потом - память под каждый элемент массива - инициализируем указатели.
1
Сыроежка
Заблокирован
09.08.2011, 17:00 #20
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
В С++ НЕТ двумерных массивов - только одномерные. Поэтому указанная вами запись - невозможна. Однако элементом массива может быть массив. Поэтому тут все четко: сначала выделяем память под массив (указателей), потом - память под каждый элемент массива - инициализируем указатели.
ВЫ уверены, что указанная запись невозможна? Попробуйте ее использовать, будет ли код компилироваться?

Как-то странно звучит, что в С++ нет двумерных массивов, а в С они есть. Что-то неладно в королевском царстве!
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
09.08.2011, 17:16 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    int const N = 20;
    int M = 10;
    unsigned char (*p)[N] = new unsigned char[M][N];
    unsigned char *p1 = (unsigned char *)p;
    for (int i = 0; i < M*N; ++i)
        p1[i] = i;
    for (int i = 0; i < M; ++i)
    {
        for (int j = 0; j < N; ++j)
            cout << setw(4) << (unsigned)p[i][j];
        cout << endl;
    }
    cout << endl << p[1]-p[0] << endl;
    return 0;
}
Добавлено через 3 минуты
Ну и в конце ещё
C++
1
delete [] p;
3
Сыроежка
Заблокирован
09.08.2011, 17:19 #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    int const N = 20;
    int M = 10;
    unsigned char (*p)[N] = new unsigned char[M][N];
    unsigned char *p1 = (unsigned char *)p;
    for (int i = 0; i < M*N; ++i)
        p1[i] = i;
    for (int i = 0; i < M; ++i)
    {
        for (int j = 0; j < N; ++j)
            cout << setw(4) << (unsigned)p[i][j];
        cout << endl;
    }
    cout << endl << p[1]-p[0] << endl;
    return 0;
}
Добавлено через 3 минуты
Ну и в конце ещё
C++
1
delete [] p;
Надо же! А кто-то говорил, что в С++ двумерных массивов нет!
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
09.08.2011, 17:21 #23
Цитата Сообщение от Сыроежка Посмотреть сообщение
Как-то странно звучит, что в С++ нет двумерных массивов, а в С они есть.
А в голых сях они откуда взялись?

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Надо же! А кто-то говорил, что в С++ двумерных массивов нет!
Любой массив в памяти располагается линейно, и не важно сколько у него измерений, хоть сто будет, все равно это одномерный.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
09.08.2011, 17:25 #24
Сыроежка, читайте стандарт... В С++ НЕТ многомерных массивов. Только одномерные. Именно поэтому при объявлении массива с многими размерностями, разрешается ТОЛЬКО ОДНУ - самую старшую - не указывать...
1
Сыроежка
Заблокирован
09.08.2011, 17:25 #25
Цитата Сообщение от oxotnik Посмотреть сообщение
А в голых сях они откуда взялись?

Добавлено через 1 минуту
Любой массив в памяти располагается линейно, и не важно сколько у него измерений, хоть сто будет, все равно это одномерный.
А в С они взялись из стандарта! Там даже есть константа, задающая максимальное количество размерностей массива! Вы очевидно путаете определение n-мерных массивов и то, как они располагаются в памяти. Как бы массивы не располагались в памяти, они остаются массивами!
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
09.08.2011, 17:25 #26
Цитата Сообщение от Сыроежка Посмотреть сообщение
Надо же! А кто-то говорил, что в С++ двумерных массивов нет!
Сыроежка, я говорил? Хотя рассматривать ли это как двухмерный массив или как массив массивов — это какой-то схоластический спор получится. Я в таком не участвую
Хотя здесь, очевидно, получился полудинамический двухмерный массив, так как второе измерение константного размера.
1
Сыроежка
Заблокирован
09.08.2011, 17:27 #27
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Сыроежка, читайте стандарт... В С++ НЕТ многомерных массивов. Только одномерные. Именно поэтому при объявлении массива с многими размерностями, разрешается ТОЛЬКО ОДНУ - самую старшую - не указывать...
Да, вот, я как раз стандарт читал! И как-то нигде не увидел, что в С или в С++ нет двумерных массивов. При этом ваш аргумент не состоятелен! Он не имеет никакого отношения к тому, есть массивы или нет. А не указывают самую старшую размерность потому, что массив в выражениях, за некоторыми исключениями, преобразуется в указатель на массив меньшей размерности! Только и всего!
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
09.08.2011, 17:29 #28
Цитата Сообщение от Сыроежка Посмотреть сообщение
Надо же! А кто-то говорил, что в С++ двумерных массивов нет!
Нет.
У вас размерности - константные.
У вас массив из М элементов, каждый элемент которого - массив из N элементов...
0
Сыроежка
Заблокирован
09.08.2011, 17:29 #29
Цитата Сообщение от grizlik78 Посмотреть сообщение
Сыроежка, я говорил? Хотя рассматривать ли это как двухмерный массив или как массив массивов — это какой-то схоластический спор получится. Я в таком не участвую
Хотя здесь, очевидно, получился полудинамический двухмерный массив, так как второе измерение константного размера.
Да нет. Вы как раз в выражении new указали тип двумерного массива! То есть когда выделяется память с помощью new, то указывается тип того объекта, для которого выделяется память.

В противном случае не могли бы вы мне сказать, какой это тип char[ m ][ n ]?!

И где в этом выражении знак '*', который обязателен при задании типов указателей?! Куда звездочка-то пропала?! Я щас заплачу!
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
09.08.2011, 17:31 #30
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
У вас размерности - константные.
У вас массив из М элементов, каждый элемент которого - массив из N элементов...
Только одна. В программе же видно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2011, 17:31
Привет! Вот еще темы с ответами:

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...

Динамическое выделением памяти для массивов - C++
Даны три массива вещественных чисел X(25), B(30), Y(25). Из исходных массивов сформировать массив К, элементы которого равны количеству...

Обращение к структуре в классе с выделением памяти - C++
Добрый день уважаемые форумчане. Столкнулся с такой проблемой. Есть класс: class Components { struct comps{ // -- База компонентов ...

Двумерный массив с динамическим выделением памяти - C++
Помогите пожалуйста вставить вот в эту вот задачу динамическое выделение памяти: #include &lt;iostream&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.08.2011, 17:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru