تک بست - دنیای فناوری
Techbest Desktop

نحوه ی استفاده از توابع malloc و calloc در زبان سی


 

در این مقاله قصد داریم با نحوه ی عملکرد توابع تخصیص حافظه ی پویا در زبان برنامه نویسی سی آشنا شویم.


توابع ذکر شده ، malloc و calloc هستند که از نظر کارایی در بحث های ما تفاوت چندانی ندارند.


تعریف این دو تابع در کتابخانه های malloc.h یا stdlib.h موجود هستند.


خروجی این دو تابع اشاره گری به آدرس اولین خانه ی حافظه اختصاص یافته است.البته در برخی مواقع امکان دارد که سیستم عامل بنا به دلایلی نتواند حافظه ی موردنیاز ما را تخصیص دهد و در اینصورت مقدار NULL یا تهی را به اشاره گر برمیگرداند.پس حتما قبل از اقدام به استفاده از حافظه ی مورد نیاز بررسی کنید که مقدار اشاره گر تهی نباشد.


در نهایت و پس از استفاده از حافظه ی موردنیاز خود و انجام عملیاتی روی داده ها ، با استفاده از تابع free حافظه ی تخصیص یافته را آزاد کنید تا سیستم عامل بتواند برای انجام پردازش های دیگر از آن استفاده کند.


نحوه ی استفاده از این توابع همانطور که در شکل بالا هم تا حدودی مشخص است به صورت زیر است : 




 ; اشاره گر* int


 ; (سایز مورد نیاز برحسب بایت)  malloc  (* نوع اشاره گر) = اشاره گر


...


   ; (اشاره گر) free






اما بهتر میدانیم به جای این روش ، از مثال عملی برای تفهیم مطلب استفاده کنیم : 




// malloc()  =====>          ptr = (cast-type*) malloc (byte-size)


#include <stdio.h>

#include <stdlib.h>

int main(){

    int n,*ptr;

    printf("Enter number of elements: ");

    scanf("%d",&n);

    ptr = (int*) malloc (n*sizeof(int));  //memory allocated using malloc

    if (ptr==NULL)                     

    {

        printf("Error! memory not allocated.");

        exit(0);

    }

           ..........    //doing somethings with data


   free (ptr) ; 




//calloc()  =====>            ptr=(cast-type*)calloc(n,element-size);

#include <stdio.h>

#include <stdlib.h>

int main(){

    int num,*ptr;

    printf("Enter number of elements: ");

    scanf("%d",&num);

    ptr = (int *) calloc (num,sizeof(int));

    if (ptr==NULL)

    {

        printf("Error! memory not allocated.");

        exit(0);

    }


          ...........   //doing somethings with data


         free (ptr) ;




همانطور که احتمالا متوجه شدید تفاوت این دو تابع از نظر سینتکس ، تعداد آرگومان های ورودی آنهاست.


تذکر : پس از استفاده از حافظه ی مورد نیاز خود حتما آن را آزاد کنید وگرنه الگوریتمتان در واقع تفاوتی با استفاده از حافظه ی پویا نخواهد کرد.


برای مطالعه ی بیشتر پیرامون تخصیص حافظه ی پویا به صفحه ی ویکیپدیا مراجعه کنید.