C Динамічне розподіл пам'яті за допомогою malloc (), calloc (), free () & realloc ()

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

Як відомо, масив - це сукупність фіксованої кількості значень. Після оголошення розміру масиву ви не зможете змінити його.

Іноді розмір заявленого вами масиву може бути недостатнім. Щоб вирішити цю проблему, ви можете виділити пам’ять вручну під час роботи. Це називається динамічним розподілом пам'яті в програмуванні на Сі.

Для виділення пам'яті динамічного, бібліотечні функції 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-мозоль ()

Назва "мозоль" означає суміжне виділення.

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

Цікаві статті...