В этой главе описывается динамическое управление памятью на языке C. Язык программирования C предоставляет несколько функций для распределения памяти и управления ею. Эти функции можно найти в заголовочном файле <stdlib.h> .
Sr.No. | Описание функции |
---|---|
1 |
void * calloc (int num, int size); Эта функция выделяет массив из num элементов, каждый из которых будет иметь размер в байтах. |
2 |
void free (void * address); Эта функция освобождает блок памяти, указанный в адресе. |
3 |
void * malloc (int num); Эта функция выделяет массив из num байтов и оставляет их неинициализированными. |
4 |
void * realloc (void * address, int newsize); Эта функция перераспределяет память, расширяя ее до новостей . |
void * calloc (int num, int size);
Эта функция выделяет массив из num элементов, каждый из которых будет иметь размер в байтах.
void free (void * address);
Эта функция освобождает блок памяти, указанный в адресе.
void * malloc (int num);
Эта функция выделяет массив из num байтов и оставляет их неинициализированными.
void * realloc (void * address, int newsize);
Эта функция перераспределяет память, расширяя ее до новостей .
Выделение памяти динамически
При программировании, если вы знаете размер массива, это легко, и вы можете определить его как массив. Например, чтобы сохранить имя любого человека, оно может содержать до 100 символов, поэтому вы можете определить что-то следующим образом:
char name[100];
Но теперь давайте рассмотрим ситуацию, когда у вас нет представления о длине текста, который нужно сохранить, например, вы хотите сохранить подробное описание по теме. Здесь нам нужно определить указатель на символ, не определяя, сколько памяти требуется, и позже, в зависимости от потребности, мы можем выделить память, как показано в следующем примере —
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат.
Name = Zara Ali Description: Zara ali a DPS student in class 10th
Эту же программу можно написать с помощью calloc (); единственное, вам нужно заменить malloc на calloc следующим образом:
calloc(200, sizeof(char));
Таким образом, вы имеете полный контроль и можете передавать любое значение размера при выделении памяти, в отличие от массивов, где после определения размера вы не можете его изменить.
Изменение размера и освобождение памяти
Когда ваша программа выходит, операционная система автоматически освобождает всю память, выделенную вашей программой, но в качестве хорошей практики, когда вам больше не нужна память, вы должны освободить эту память, вызвав функцию free () .
Кроме того, вы можете увеличить или уменьшить размер выделенного блока памяти, вызвав функцию realloc () . Давайте еще раз проверим вышеуказанную программу и воспользуемся функциями realloc () и free () —
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student."); } /* suppose you want to store bigger description */ description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcat( description, "She is in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); /* release memory using free() function */ free(description); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат.
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
Вы можете попробовать приведенный выше пример без перераспределения дополнительной памяти, а функция strcat () выдаст ошибку из-за нехватки доступной памяти в описании.