Last active
May 1, 2025 20:19
-
-
Save sunmeat/764a336d5a4f110e0e35e2e0e6d7cd84 to your computer and use it in GitHub Desktop.
malloc calloc realloc free example C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
// функція для демонстрації malloc | |
void malloc_example() { | |
system("title malloc example"); | |
int k = 5; | |
// malloc повертає вказівник на виділену пам'ять, сама пам'ять не ініціалізується | |
int* ptr = (int*)malloc(k * sizeof(int)); // виділення пам'яті за допомогою malloc | |
if (!ptr) { | |
cout << "не вдалося виділити пам'ять!"; | |
return; | |
} | |
cout << "iнiцiалiзацiя значень...\n"; | |
for (int i = 0; i < k; i++) { | |
ptr[i] = i * 2 + 1; | |
// *(ptr + i) як альтернатива ptr[i] | |
cout << *(ptr + i) << "\t"; | |
} | |
cout << "\n\n"; | |
free(ptr); // звільнення пам'яті в старому стилі | |
} | |
// функція для демонстрації calloc | |
void calloc_example() { | |
system("title calloc example"); | |
// виділення та ініціалізація пам'яті для масиву з 4 елементів | |
int* p1 = (int*)calloc(4, sizeof(int)); | |
// той самий варіант, але з вказанням типу масиву | |
int* p2 = (int*)calloc(1, sizeof(int[4])); | |
// той самий варіант без повторного вказання типу | |
int* p3 = (int*)calloc(4, sizeof * p3); | |
// на відміну від malloc, calloc ініціалізує пам'ять нулями | |
if (p2) { | |
for (int n = 0; n < 4; ++n) // виведення елементів масиву | |
cout << "p2[" << n << "] == " << p2[n] << '\n'; | |
} | |
free(p1); // звільнення пам'яті | |
free(p2); | |
free(p3); | |
} | |
// функція для демонстрації realloc | |
void realloc_example() { | |
system("title realloc example"); | |
int k = 5; | |
float* ptr, *new_ptr; | |
ptr = (float*)malloc(k * sizeof(float)); | |
if (!ptr) { | |
cout << "не вдалося виділити пам'ять!"; | |
return; | |
} | |
// ініціалізація виділеної пам'яті | |
for (int i = 0; i < k; i++) { | |
ptr[i] = i * 1.5f; | |
} | |
int nk = k * 2; // подвоїмо кількість елементів | |
// realloc займається тим, що виділяє нову пам'ять, копіює туди дані зі старої пам'яті і звільняє стару пам'ять | |
// перерозподіляємо пам'ять | |
new_ptr = (float*)realloc(ptr, nk * sizeof(float)); | |
if (!new_ptr) { | |
cout << "не вдалося перерозподілити пам'ять!" << endl; | |
return; | |
} | |
// ініціалізація ново-виділеної пам'яті | |
for (int i = k; i < nk; i++) { | |
new_ptr[i] = i * 2.5f; | |
} | |
for (int i = 0; i < nk; i++) { | |
cout << new_ptr[i] << "\t"; | |
} | |
cout << "\n\n"; | |
free(new_ptr); // звільнення пам'яті | |
} | |
int main() { | |
setlocale(LC_ALL, "Ukrainian"); | |
// викликаємо функції | |
malloc_example(); | |
calloc_example(); | |
realloc_example(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment