Учебники

C — Управление памятью

В этой главе описывается динамическое управление памятью на языке 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];

Но теперь давайте рассмотрим ситуацию, когда у вас нет представления о длине текста, который нужно сохранить, например, вы хотите сохранить подробное описание по теме. Здесь нам нужно определить указатель на символ, не определяя, сколько памяти требуется, и позже, в зависимости от потребности, мы можем выделить память, как показано в следующем примере —

Live Demo

#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 () —

Live Demo

#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 () выдаст ошибку из-за нехватки доступной памяти в описании.