مدیریت حافظه در C
تخصیص حافظه پویا با malloc، calloc، realloc و free
حافظه پویا چیست؟
تا حالا آرایهها را با اندازه ثابت تعریف میکردیم که در زمان کامپایل مشخص است. اما اگر اندازه دادهها را از قبل ندانیم چه؟ اینجاست که حافظه پویا (Dynamic Memory) به کمک میآید — در زمان اجرا از heap حافظه میگیریم.
malloc — تخصیص حافظه
#include <stdlib.h>
int *arr = (int*)malloc(5 * sizeof(int)); // آرایه ۵ عنصری پویا
- malloc تعداد بایت موردنیاز را میگیرد و آدرس حافظه را برمیگرداند
- اگر حافظه کافی نباشد
NULLبرمیگرداند — همیشه بررسی کنید! - حافظه گرفتهشده مقداردهی نمیشود (مقادیر نامعتبر دارد)
calloc — تخصیص با صفر کردن
int *arr = (int*)calloc(5, sizeof(int)); // ۵ عنصر، همه صفر
مثل malloc است اما همه بایتها را صفر میکند.
realloc — تغییر اندازه
arr = (int*)realloc(arr, 10 * sizeof(int)); // بزرگتر به ۱۰ عنصر
محتوای قبلی حفظ میشود.
free — آزاد کردن حافظه
free(arr); // حافظه برگردانده میشود
arr = NULL; // روش خوب: جلوگیری از استفاده مجدد اشتباه
⚠️ هر حافظهای که میگیرید باید برگردانید! وگرنه نشت حافظه (memory leak) رخ میدهد.
مثال کامل
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
// تخصیص پویا
int *arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("خطا: حافظه کافی نیست!");
return 1;
}
// استفاده
for (int i = 0; i < n; i++) {
arr[i] = i * 10;
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
// آزادسازی
free(arr);
return 0;
}
مقایسه استک و هیپ
| ویژگی | استک (Stack) | هیپ (Heap) |
|---|---|---|
| تخصیص | خودکار | دستی (malloc) |
| سرعت | بسیار سریع | کندتر |
| اندازه | محدود | بزرگ |
| عمر | تا پایان تابع | تا فراخوانی free |
خطاهای رایج
- Memory Leak: فراموش کردن free
- Dangling Pointer: استفاده از اشارهگر بعد از free
- Double Free: دو بار free کردن یک حافظه
- بررسی نکردن NULL: بعد از malloc
این مبحث بخشی از دوره آموزش کامل زبان C است.