/* Done by TheTutor -- 7/11/01
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
Динамическое выделение памяти - это то, что вы будете часто делать в процессе программирования.
Каждый раз когда появляется надпись "Loading...", прежде всего освобождается вся использовавшаяся
ранее память (RAM). Затем компьютер выделяет достаточный объем памяти для хранения всех
текстур, счета и т.д. которые будут использованы в следующем уровне игры.
Если бы было нужно загружать ВСЕ в память сразу, вам бы понадобилось 20 гигабайт памяти чтобы
играть в среднюю игру.
Итак, в этом примере мы собираемся сделать кое-что простое.
Мы запросим число. Затем мы выделим в памяти количество целочисленных переменных,
равных введенному числу. Когда мы создадим наш "динамический массив", мы заполним его,
и выведем на экран, после чего освободим память.
*/
#include <stdio.h>
#include <stdlib.h> // определяет EXIT_FAILURE и EXIT_SUCCESS
#include <malloc.h>
int main()
{
int *num_list = NULL; // Указатель на адрес, по которому мы выделим память.
int max_num = 0; // Это число будет вводиться пользователем -- Оно указывает, для скольких переменных
// мы выделим память.
int count = 0; // Эта переменная будет использоваться как счетчик.
printf("Enter the number of allocations: "); // "Введите число переменных"
scanf("%d",&max_num); // Читаем максимальное число переменных
// ВЫДЕЛЯЕМ ПАМЯТЬ
num_list = (int*)malloc(max_num * sizeof(int));
/* Шаг за шагом:
(int*) это преобразование типов. Это означает, что мы выделяем память под тип int.
malloc() (memory allocation) - это функция, которая используется для выделения памяти.
"max_num" это число переменных, которые мы хотим создать. Итак, вкратце, если вы
хотите динамически создать массив из 10 элементов, вы напишете:
array_of_ints = (int*)malloc(10 * sizeof(int));
Функция sizeof() возвращает число байтов, занимаемое тем, что передается в эту функцию.
Например целые числа типа int для 32-битных процессоров Intel (Win95 и выше), занимают
4 байта. Поэтому sizeof(int) = 4.
То, что делает функция malloc() - она выделяет определенное количество байтов, которое
вы запрашиваете, а затем передает эту память тому, чему вы ее присвоите. Когда вы
выделяете память, ничто (внутри или вне программы) не имеет к ней доступа, пока вы ее
не освободите.
*/
// Всегда полезно проверять, удался ли вызов malloc() -- В случае неудачи malloc() возвращает NULL
if(num_list == NULL)
{
printf("\nmalloc() failed\n");
return EXIT_FAILURE;
}
// Если мы добрались досюда, malloc() сработала!
// Заполним нашу свежесозданную память
for(count = 0; count < max_num; count++)
num_list[count] = count + 1;
/* Первый элемент массива заполнится числом "1"
Второй элемент заполнится "2".
Если не знаете, что такое массив, обратитесь к обучалке по массивам. :) */
printf("\n\n"); // Два пробела
// Напечатаем массив на экран - Без форматирования это будет плохо смотреться
for(count = 0; count < max_num; count++)
printf("%d ",num_list[count]);
// И напоследок, мы должны освободить память
free(num_list);
num_list = NULL;
/* Неплохая идея сбрасывать указатель, который использовался для хранения памяти в значение NULL
при завершении работы. Часто функции проверяют, равен ли указатель значению NULL, чтобы
определить указывает ли он на "действительную память". Если просто освободить память, он будет
указывать на адрес памяти, но по этому адресу не будет никакой "действительной памяти" */
printf("\n\n");
return EXIT_SUCCESS; // Программа успешно завершилась
} // конец main()
/* ПРЕДУПРЕЖДЕНИЕ:
При работе с динамической памятью у вас будут ошибки. Я бы даже сказал, что
динамическая память (память, выделенная во время работы программы) и повреждения
памяти (например при превышении границ массива) наиболее частые места в программах,
где случаются баги или ошибки.
Так что не расстраивайтесь :)
*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|