powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / трехзвездночный массив
17 сообщений из 17, страница 1 из 1
трехзвездночный массив
    #38158247
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
У меня есть инициализированный трехзвездночный массив (массив указателей на указатели):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int *** objects;
objects = new int ** [3];
for (int i=0;i<3;i++)
	objects[i] = new int*;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		objects[i][j] = NULL;


По нему есть 2 вопроса:
1) Какой размер массива?
Вот эта строчка - objects[i] = new int* - выделяет 4 байта, или выделяет один байт (по идее один байт)?
2) Как правильно удалить такой массив?
Вот так не получается, получаю свал на втором блоке for:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		delete objects[i][j];

for (int i=0;i<3;i++)
	delete objects[i];

delete objects;


Заранее спасибо!
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158260
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int *** objects;
objects = new int ** [3];

По нему есть 2 вопроса:
1) Какой размер массива?

3*sized(void*)


Вот эта строчка -

objects[i] = new int*
- выделяет 4 байта, или выделяет один байт (по идее один байт)?

1*sizeof(void*)

2) Как правильно удалить такой массив?
Вот так не получается, получаю свал на втором блоке for:

А ты его неправильно выделяешь.
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158737
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
А где именно не правильно?
Если такое попробовать, то все правильно выводит - девять единиц:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int* a = new int;
*a = 1;
int *** objects;

objects = new int ** [3];
for (int i=0;i<3;i++)
	objects[i] = new int*;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		objects[i][j] = a;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		cout<<*objects[i][j]<<endl;
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158809
Vadddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximuS_G,
если двухмерный массив указателей

создание:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int   height   = 20;
int   width    = 80;

pField = new int** [height];
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];
    memset (pField[i], 0, width * 4);  // инициализация нулями
}



удаление:
Код: plaintext
1.
2.
3.
for (int i = 0; i < height; ++i)
    delete [] pField[i];
delete [] pField;
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158814
Vadddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пропустил в начале
Код: plaintext
1.
pField = new int** [height];
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158821
Vadddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри, в начале
Код: plaintext
1.
int *** pField;
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38158962
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, я понял, спс! Получается моя ошибка была вот здесь:
Код: plaintext
1.
objects[i] = new int*;


Вместо массива указателей, выделял только один указатель.

Здесь
Vaddddddmemset (pField[i], 0, width * 4); // инициализация нулями
как я понял сразу выделяется память под int на все элементы. И если элементов будет только 2 из 160 (20x80), то зря получается израсходовали кучу памяти. Может быть лучше не выделять сразу память, а выделять когда она нужна?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];
}
for (int i=0;i<height;i++)
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;

objects[1][2] = new int(7);
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159018
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MaximuS_G, ну указатель занимает не меньше памяти чем int
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159023
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?MaximuS_G, ну указатель занимает не меньше памяти чем int
А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159076
Vadddddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
память оператор new выделяет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int   height   = 20;
int   width    = 80;

int *** pField;
pField = new int** [height];       // выделется память для 20 указателей
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];       //  20 раз выделяется память для 80-ти указателей
    memset (pField[i], 0, width * 4);  // и заполняется  нулями
}



memset памяти не выделяет.

строка -
Код: sql
1.
memset (pField[i], 0, width * 4);


эквивалентна
Код: sql
1.
2.
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;



можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int   height   = 20;
int   width    = 80;

int *** pField;
pField = new int** [height];       // выделется память для 20 указателей
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];       //  20 раз выделяется память для 80-ти указателей
}

for (int i=0;i<height;i++)              // и заполняется  нулями
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;



это только массив указателей создали,
сами обьекты на которые указатели ссылаются еще нужно создать:
Код: sql
1.
 pField[i][j] = new int;
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159123
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, А где именно не правильно?

так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int ** objects;
objects = new int* [3];
for (int i=0;i<3;i++)
	objects[i] = new int[200];

for (int i=0;i<3;i++)
	for (int j=0;j<200;j++)
		objects[i][j] = 42;
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159127
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, спасибо
memset памяти не выделяет.
Интересно, зачем ей тогда передавать размер памяти 3м параметром?
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159131
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G?MaximuS_G, ну указатель занимает не меньше памяти чем int
А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.

Ага, а адрес всегда 8-мибитовый :-)
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159134
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЯ понял, спасибо
memset памяти не выделяет.
Интересно, зачем ей тогда передавать размер памяти 3м параметром?

Чтобы ей знать этот размер памяти.
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159235
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivMaximuS_Gпропущено...

А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.

Ага, а адрес всегда 8-мибитовый :-)

The value stored in the pointer is an address to memory. If you're on a 32-bit system, that pointer into memory is going to be 32 bits (or four bytes) long. If you're on a 64-bit system, that pointer into memory is going to be 64 bits (or eight bytes) long.
The size of the data that holds the location in memory has nothing to do with the size of the data represented at that location in memory.
Теперь все ясно.

MasterZivЧтобы ей знать этот размер памяти.
То есть память не выделиться?
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159333
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧтобы ей знать этот размер памяти.
Кажется здесь указана другая причина
авторThe memset function takes three arguments. The first argument is a pointer (notice the void *) to whatever data type you are planning to set, the second argument is the specific value you are going to set your data with; there is however a catch in that memset will convert your integer value into an unsigned char when writing the data. The third argument is how many of those specific values are needed.
...
Рейтинг: 0 / 0
трехзвездночный массив
    #38159404
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И правда задает количество элементов, вот проверка:
Код: plaintext
1.
2.
3.
4.
5.
int* a = new int[3];
memset(a,0,2*sizeof(int)); // только двум элементам из 3х проставляем 0
cout<<a[0]; // 0
cout<<a[1]; // 0 
cout<<a[2]; // не ноль
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / трехзвездночный массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]