با سلام خدمت تمامی دوستان عزیز سایت پی وی لرن .و کاربرانی که دوره کامل آموزش زبان C را دنبال می کنند. و کاربرانی که با سری آموزش های زبان C همراهمون هستند. در ادامه به شرح مدیریت حافظه در زبان C و اختصاص حافظه به صورت پویا و تغییر اندازه و آزاد سازی حافظه در C می پردازیم.
در این قسمت نحوه مدیریت حافظه به صورت پویا توضیح داده می شود.
در زبان برنامه نویسی C ،توابع تخصیص و مدیریت حافظه مختلفی وجود دارد که در هدر فایل stdlib.h قرار گرفته اند.
ردیف | توابع و توضیحات |
۱ | void *calloc(int num, int size);فضای حافظه مورد نیاز یک آرایه را به طول num اختصاص می دهد. با مقدار دهی اولیه. |
۲ | void free(void *address);این تابع فضای حافظه اختصاص داده شده را آزاد می کند. |
۳ | void *malloc(int num);فضای حافظه مورد نیاز یک آرایه را به طول num اختصاص می دهد. بدون مقدار دهی اولیه. |
۴ | void *realloc(void *address, int newsize);این تابع فضای اختصاص داده شده رو با اندازه جدید به روز می کند. |
در هنگام برنامه نویسی، اگر از اندازه آرایه آگاهی دارید، تعریف آن را آسان می کند و می توانید آن را به صورت آرایه تعریف کنید.
برای مثال، برای ذخیره نام هر شخص، می توانید یک آرایه با حداکثر ۱۰۰ کاراکتر تعریف کنید.
بنابراین شما می توانید چیزی را به صورت زیر تعریف کنید.
1 | char name[100]; |
اما اکنون اجازه دهید وضعیتی را در نظر بگیریم که در آن شما در مورد طول متن مورد نیاز خود برای ذخیره نظری ندارید، یا طول متن را نمی دانید.
برای مثال، شما می خواهید یک توضیح دقیق درباره یک موضوع را ذخیره کنید. در اینجا مشخص نیست کاربر چند کاراکتر نیاز دارد تا طول آرایه براساس آن تنظیم شود.
پس ما نیاز به تعریف یک اشاره گر به کاراکتر بدون تعریف مقدار حافظه مورد داریم. تا میزان حافظه اختصاصی را به صورت پویا و بر اساس نیاز تعیین کنیم.
ما می توانیم اختصاص حافظه را به صورت مثال زیر نشان بدهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); } |
زمانی که کد بالا توسط کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 2 | Name = Zara Ali Description: Zara ali a DPS student in class 10th |
همان برنامه را می توان با استفاده از()calloc ؛ فقط با جایگزینی malloc با calloc بنویسید. به شرح زیر :
1 | calloc(200, sizeof(char)); |
بنابراین شما کنترل کامل دارید و در هنگام اختصاص حافظه، می توانید هر مقدار اندازه را تنظیم کنید،
بر خلاف آرایه های عادی که در آن اندازه تعیین شده است و شما نمی توانید آن را تغییر دهید.
هنگامی که اجرای برنامه به پایان می رسد، سیستم عامل به طور خودکار تمام حافظه اختصاص داده شده به برنامه شما را آزاد می کند،
اما زمانیکه از تخصیص حافظه پویا استفاده می کنید و دیگر نیازی به حافظه ندارید با فراخوانی تابع()free این حافظه را آزاد کنید.
در عوض، با فراخوانی()realloc ، می توانید اندازه یک بلوک حافظه اختصاص داده شده را افزایش یا کاهش دهید.
بگذارید یک بار دیگر برنامه فوق را بررسی کنیم و از توابع()realloc و()free استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student."); } /* suppose you want to store bigger description */ description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcat( description, "She is in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); /* release memory using free() function */ free(description); } |
زمانی که کد بالا توسط کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:
1 2 | Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th |
شما می توانید مثال بالا را مجددا بدون تخصیص حافظه اضافی امتحان کنید و عملکردهای ()strcat به دلیل عدم وجود حافظه موجود در توضیحات خطایی را ارائه می دهد.
توضیحاتی در مورد مدیریت حافظه در زبان C ، اختصاص حافظه به صورت پویا و تغییر اندازه و آزاد سازی حافظه در C ارائه شد.
آرگومان های خط فرمان در زبان C را در جلسه آینده خواهیم داشت.