C Распределение динамической памяти с использованием malloc (), calloc (), free () и realloc ()

В этом руководстве вы научитесь динамически выделять память в вашей программе на C, используя стандартные библиотечные функции: malloc (), calloc (), free () и realloc ().

Как вы знаете, массив - это набор фиксированного количества значений. После объявления размера массива его нельзя изменить.

Иногда размер объявленного вами массива может быть недостаточным. Чтобы решить эту проблему, вы можете выделить память вручную во время выполнения. Это известно как динамическое выделение памяти в программировании на C.

Для выделения памяти Динамического, библиотечные функции malloc(), calloc(), realloc()и free()используются. Эти функции определены в заголовочном файле.

C malloc ()

Название «malloc» означает выделение памяти.

malloc()Функция резервирует блок памяти указанного количества байтов. И он возвращает указатель, voidкоторый можно преобразовать в указатели любой формы.

Синтаксис malloc ()

 ptr = (castType*) malloc(size);

пример

 ptr = (float*) malloc(100 * sizeof(float));

Вышеупомянутый оператор выделяет 400 байт памяти. Это потому, что размер floatсоставляет 4 байта. И указатель ptr содержит адрес первого байта в выделенной памяти.

Результатом выражения является NULLуказатель, если память не может быть выделена.

C calloc ()

Имя «calloc» означает непрерывное размещение.

malloc()Функция выделяет память и уходит память неинициализированным. В то время как calloc()функция выделяет память и инициализирует все биты нулями.

Синтаксис calloc ()

 ptr = (castType*)calloc(n, size);

Пример:

 ptr = (float*) calloc(25, sizeof(float));

Приведенный выше оператор выделяет непрерывное пространство в памяти для 25 элементов типа float.

C бесплатно ()

Динамически выделенную память , созданную либо calloc()или malloc()не получает освобожден от своих собственных. Вы должны явно использовать, free()чтобы освободить пространство.

Синтаксис free ()

 free(ptr);

Этот оператор освобождает пространство, выделенное в памяти, на которую указывает ptr.

Пример 1: malloc () и free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Здесь мы динамически распределили память для n числа int.

Пример 2: calloc () и free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

Если динамически выделяемой памяти недостаточно или больше, чем требуется, вы можете изменить размер ранее выделенной памяти с помощью realloc()функции.

Синтаксис realloc ()

 ptr = realloc(ptr, x);

Здесь ptr перераспределяется с новым размером x.

Пример 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Когда вы запустите программу, вывод будет:

 Введите размер: 2 Адреса ранее выделенной памяти: 26855472 26855476 Введите новый размер: 4 Адреса вновь выделенной памяти: 26855472 26855476 26855480 26855484

Интересные статьи...