Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active May 1, 2025 20:19
Show Gist options
  • Save sunmeat/764a336d5a4f110e0e35e2e0e6d7cd84 to your computer and use it in GitHub Desktop.
Save sunmeat/764a336d5a4f110e0e35e2e0e6d7cd84 to your computer and use it in GitHub Desktop.
malloc calloc realloc free example C++
#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