C Динамическое выделение памяти
Динамическое выделение памяти C
В этом руководстве вы научитесь динамически выделять память в своей программе на C, используя стандартные библиотечные функции:malloc(), calloc(), free() и realloc().
Как вы знаете, массив представляет собой набор фиксированного числа значений. Как только размер массива объявлен, вы не можете его изменить.
Иногда размер объявленного вами массива может оказаться недостаточным. Чтобы решить эту проблему, вы можете выделить память вручную во время выполнения. В программировании на C это называется динамическим выделением памяти.
Для динамического выделения памяти библиотечные функции имеют значение malloc()
. , calloc()
, realloc()
и free()
используются. Эти функции определены в <stdlib.h>
файл заголовка.
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
. .
С бесплатно()
Динамически выделяемая память, созданная с помощью calloc()
или malloc()
не освобождается самостоятельно. Вы должны явно использовать free()
чтобы освободить место.
Синтаксис функции free()
free(ptr);
Этот оператор освобождает место, выделенное в памяти, на которое указывает ptr
. .
Пример 1:malloc() и free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
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;
}
Вывод
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
Здесь мы динамически выделили память для n количество int
.
Пример 2:calloc() и free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
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;
}
Вывод
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
<час> C realloc()
Если динамически выделенной памяти недостаточно или больше, чем требуется, вы можете изменить размер ранее выделенной памяти с помощью realloc()
функция.
Синтаксис realloc()
ptr = realloc(ptr, x);
Здесь ptr перераспределяется с новым размером x .
<час>Пример 3:realloc()
#include <stdio.h>
#include <stdlib.h>
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:\n");
for(i = 0; i < n1; ++i)
printf("%pc\n",ptr + i);
printf("\nEnter the new size: ");
scanf("%d", &n2);
// rellocating the memory
ptr = realloc(ptr, n2 * sizeof(int));
printf("Addresses of newly allocated memory:\n");
for(i = 0; i < n2; ++i)
printf("%pc\n", ptr + i);
free(ptr);
return 0;
}
Вывод
Enter size: 2 Addresses of previously allocated memory: 26855472 26855476 Enter the new size: 4 Addresses of newly allocated memory: 26855472 26855476 26855480 26855484
Язык C
- Постоянная память (ПЗУ)
- Микропроцессоры
- Управление памятью C++:создание и удаление
- Cervoz обновляет память DDR4-2666 следующего поколения
- C++ динамическое выделение массивов с примером
- Функция calloc() в библиотеке C с программой ПРИМЕР
- Функция realloc() в библиотеке C:как использовать? Синтаксис и пример
- C - Управление памятью
- Динамическое ценообразование в традиционной розничной торговле неизбежно
- Динамическая память С++