مدیریت حافظه در C

تخصیص حافظه پویا با malloc، calloc، realloc و free

حافظه پویا چیست؟

تا حالا آرایه‌ها را با اندازه ثابت تعریف می‌کردیم که در زمان کامپایل مشخص است. اما اگر اندازه داده‌ها را از قبل ندانیم چه؟ اینجاست که حافظه پویا (Dynamic Memory) به کمک می‌آید — در زمان اجرا از heap حافظه می‌گیریم.

malloc — تخصیص حافظه

#include <stdlib.h>

int *arr = (int*)malloc(5 * sizeof(int));  // آرایه ۵ عنصری پویا

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

خطاهای رایج

این مبحث بخشی از دوره آموزش کامل زبان C است.

ابزارهای مرتبط