Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2014, 11:57   #1
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию malloc (выделение памяти двумерному массиву)

Здравствуйте, подскажите пожалуйста, правильно ли тут построено выделение памяти. Если неправильно, то почему?

Спасибо.

Код:
/* malloc.cpp */

#include <stdlib.h> // Местонахождение фн-ции "void *malloc(size_t size);"
#include <stdio.h> // Местонахождение фн-ции "int printf(const char *управляющая_строка, ...);"

typedef unsigned int un_int; // Новое имя целочисленного неотрицательного типа
static const un_int n = 4; // Указывает ШхД двумерного массива

int main() {
//-----------------> Выделение памяти:

	int **m = (int**)malloc(n*sizeof(int*) + sizeof(int)*n*n); // Выделяем память массиву указателей |*|*|*|*| + двумерному массиву |&|&|&|&|
	for (un_int i = n-1, k = 1; i+1 < n+n; ++i, ++k)
		m[i+1-n] = (int*)&m[i+1*k]; // Передаем адрес ячейки указателю с интервалом "i+1*k"
	
//-----------------> Заполнение массива числами от 0..(n*n-1):

	for (un_int i = 0, k = 0; i < n; ++i) {
                for (un_int j = 0; j < n; ++j, ++k)
                        m[i][j] = k;
        }

//-----------------> Вывод содержимого массива на консоль (терминал):

        for (un_int i = 0; i < n; ++i) {
                for (un_int j = 0; j < n; ++j)
                        printf("%d ", m[i][j]);
        printf("\n");
        }

//-----------------> Освобождение памяти:

	free(m);

//-----------------> Возврат 0 значения фн-ции main():

	return 0;
}

Последний раз редактировалось Lifeda92; 26.08.2014 в 12:57.
Lifeda92 вне форума Ответить с цитированием
Старый 26.08.2014, 12:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы делал так: http://www.programmersforum.ru/showthread.php?t=117524
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2014, 13:27   #3
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

Подскажите еще пожалуйста, логических ошибок в блоке выделения памяти нету?

План по выделению памяти:
1. Выделяется массив указателей с кол-во элементов n (0..n-1).
2. Выделяется двумерный массив с кол-во элементов n*n (n..2n-1, 2n..3n-1, 3n..4n-1, 4n..5n-1).
3. Указатели массива указателей, указывают на адреса ячеек двумерного массива с интервалами n..2n-1, 2n..3n-1, 3n..4n-1, 4n..5n-1.

Программа делает то что я думаю?
Спасибо.
Lifeda92 вне форума Ответить с цитированием
Старый 26.08.2014, 13:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не большой спец по Сям, но по-моему твой пример делает что-то не совсем то.
Т.е. само выделение памяти как по мне... мягко говоря нестандартное.
Я как-то больше предпочитаю свой метод, выложенный выше
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2014, 15:01   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Stilet спасибо за ссылку, все предельно понятно расписано. Пригодиться.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 26.08.2014, 15:10   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пожалуйста )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2014, 15:13   #7
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

Тут ошибка была (завтыкал и написал i+1*k вот так правильно n*k):

Код:
m[i+1-n] = (int*)&m[n*k]; // Передаем адрес ячейки указателю с интервалом "n*k"
Lifeda92 вне форума Ответить с цитированием
Старый 26.08.2014, 15:16   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Lifeda92 Посмотреть сообщение
Тут ошибка была ( завтыкал и написал i+1*k вот так правильно n*k).

Код:
m[i+1-n] = (int*)&m[n*k]; // Передаем адрес ячейки указателю с интервалом "n*k"
Одна из.... Возьми за основу ссылку. которую скинул Stilet. Откровенно говоря лично я уже перестал понимать Ваш код.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 26.08.2014, 15:19   #9
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Одна из....
А какие еще есть? Подскажи пожалуйста.
Ведь при компиляции и линковке ошибок и предупреждений нету.
Значит какие-то логические ошибки...

int **m = (int**)malloc(n*sizeof(int*) + sizeof(int)*n*n); <-- Тут я создаю массив указателей и еще просто 1 длинный массив.

|*|*|*|*|&|&|&|&|&|&|&|&|&|&|&|&|&| &|&|&|

Я хотел чтобы было вот так:

for (un_int i = n-1, k = 1; i+1 < n+n; ++i, ++k)
m[i+1-n] = (int*)&m[n*k]; // Передаем адрес ячейки указателю с интервалом "n"

|*| -> |&|&|&|&|
0 ----- 4 5 6 7

|*| -> |&|&|&|&|
1 ----- 8 9 10 11

|*| -> |&|&|&|&|
2 ----- 12 13 14 15

|*| -> |&|&|&|&|
3 ----- 16 17 18 19

И программа выводит все точно как по плану:

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

И никак не могу понять, есть тут ошибки или нету...

Последний раз редактировалось Lifeda92; 26.08.2014 в 15:28.
Lifeda92 вне форума Ответить с цитированием
Старый 26.08.2014, 15:23   #10
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Lifeda92 Посмотреть сообщение
А какие еще есть? Подскажи пожалуйста.
Ведь при компиляции и линковке ошибок и предупреждений нету.
Значит какие-то логические ошибки...

int **m = (int**)malloc(n*sizeof(int*) + sizeof(int)*n*n); <-- Тут я создаю массив указателей и еще просто 1 длинный массив.

Я хотел чтобы было вот так:

|*| -> |&|&|&|&|
0 ----- 4 5 6 7

|*| -> |&|&|&|&|
1 ----- 8 9 10 11

|*| -> |&|&|&|&|
2 ----- 12 13 14 15

|*| -> |&|&|&|&|
3 ----- 16 17 18 19
В этом и загвоздка с программирование на Си/C++... ошибки по работе с памятью так скажем не всегда воспринимаются компилятором
Особенно вот это здорово
Код:
for (un_int i = n-1, k = 1; i+1 < n+n; ++i, ++k)
m[i+1-n]
Вы как-то залезли, выкрутили.... Шикарно, слов нет. Он у Вас компилируется и работает?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 26.08.2014 в 15:30.
Bugrimov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по двумерному массиву EdvardAvd Помощь студентам 16 26.11.2013 17:24
как пройти по двумерному массиву realgleb Общие вопросы C/C++ 9 10.05.2012 21:36
процедура к двумерному массиву Alenaa Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 19:34
Поиск числа по двумерному массиву. Ibanez Wizard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 31.03.2011 13:52
помогите решить задачу по двумерному массиву Kain Помощь студентам 3 10.11.2008 17:34