אופן השימוש בפונקציה MALLOC ב- C.

How Use Malloc Function C



Malloc היא פונקציה מובנית המוצהרת בקובץ הכותרת. Malloc הוא השם הקצר של 'הקצאת זיכרון' ומשמש להקצאה דינאמית של גוש אחד גדול של זיכרון רציף בהתאם לגודל שצוין. ישנם שני סוגים של הקצאת זיכרון סטטית ודינאמית. הקצאת זיכרון סטטי מתבצעת בזמן האוסף, והיא לא משתנה בזמן ריצה. הקצאת זיכרון דינמית היא הקצאת זיכרון בזמן ריצה לשם כך; אנו משתמשים ב- malloc. עכשיו הנקודה היא מאיפה הזיכרון הזה מגיע, כך שכל הדרישות הדינמיות ב- C מתקיימות מזיכרון הערימה. ביסודו של דבר, היישום/התוכנית שלנו תהיה בעלת 3 סוגי זיכרון

  • זיכרון הערימה מקומי לכל שיטה, וכאשר השיטה חוזרת, הערימה מנקה אותה אוטומטית.
  • אזור הזיכרון הגלובלי מקצה זיכרון לכל המשתנים הגלובליים. אזור זיכרון זה נוצר בתחילת התוכנית, ובסופו של דבר הוא מנקה אוטומטית את אזור הזיכרון.
  • זיכרון ערימות הוא תמיד אויב שממלא את כל הדרישות הדינמיות של תוכנית/יישום. בכל פעם שאנו הולכים להשתמש בפונקציה malloc, היא הולכת לשאול קצת זיכרון מהערימה ולתת לנו את המצביע אליה.

תחביר:







התחביר של malloc הוא (void*) malloc (size_t size). אז התחביר אומר שמאלוק דורש גודל, הוא יחזיר את המצביע בעצם מצביע חלל וגודל t מוגדר כמספר שלם לא חתום. הפונקציה Malloc פשוט מקצה בלוק זיכרון בהתאם לגודל שצוין בערימה כפי שאתה יכול לראות בתחביר שצריך לציין את הגודל, ובהצלחה הוא מחזיר מצביע המצביע על הבייט הראשון של הזיכרון שהוקצה אחרת מחזיר NULL . לכן, התפקיד של malloc הוא להקצות זיכרון בזמן ריצה.



למה מצביע חלל:

למאלוק אין מושג על מה הוא מצביע; זה פשוט אומר שהוא לא יודע אילו נתונים יאחסנו במיקום הזיכרון הזה. הוא רק מקצה זיכרון המבוקש על ידי המשתמש מבלי לדעת את סוג הנתונים שיש לאחסן בתוך הזיכרון. זו הסיבה שהוא מחזיר מצביע ריק.



Malloc רק מקצה זיכרון לאחר מכן באחריות המשתמש להקליד לסוג המתאים כך שניתן יהיה להשתמש בו כראוי בתוכנית. מצביע ריק הוא מצביע שיכול להצביע על כל סוג של נתונים malloc מחזירה מצביע ריק מכיוון שהוא לא יודע איזה סוג נתונים יישמר בתוך הזיכרון הזה.





כאן אנו מבקשים מלקוק להקצות 6 בתים של זיכרון עכשיו אם זה הצלחה malloc יחזיר מצביע ריק. במקרה זה, עלינו להקליד אותו למצביע מסוג שלם כיוון שאנו רוצים לאחסן מספר שלם בזיכרון זה. כאן malloc מקצה 6 בתים של זיכרון בערימה, וכתובת הבייט הראשון מאוחסנת ב- ptr המצביע.



תוכנית לדוגמא:

להלן תוכנית דוגמא פשוטה על מנת להבין את המושג מאלוק בצורה נכונה.

כאן אתה יכול לראות בעזרת הפונקציה printf אני מבקש מהמשתמש להזין את מספר המספרים השלמים. הכרזנו שני משתנים מעל i ו- n. משתנה n הוא המקום בו נשמור את המספר שהזין המשתמש. לאחר מכן, יש לנו פונקציה מאלוקית; אנו רוצים שהמאלוק יקצה את המקבילה לגודל של מספרים שלמים. אנו מכפילים גודל אם int עם n; זה ייתן לנו את הגודל של n מספרים שלמים. לאחר מכן, malloc יחזיר מצביע חלל, ואנו מקלידים אותו למצביע שלם, ואנו שומרים את הכתובת בתוך מצביע ה- ptr. חיזוי דפוס חשוב מכיוון שהוא נוהג טוב.

כעת, אם המצביע מכיל NULL, המשמעות היא שהזיכרון אינו זמין. אז פשוט נצא מהתוכנית עם מצב כשל היציאה. אם זה לא המקרה, נוכל להריץ בקלות את הלולאה for.

הלולאה תפעל מ- 0 ל- n-1, ונבקש מהמשתמש להזין מספר שלם אחת אחת בכל פעם. בתוך הפונקציה scanf, יש דבר אחד כתוב ptr+i כפי שאנו יודעים כי ptr מכיל את הכתובת של הבייט הראשון של הזיכרון. נניח שהכתובת היא 1000 כאן i שווה לאפס בהתחלה אז 1000+0 הוא 1000 אז בתוך הכתובת הזו המספר השלם הראשון שלנו יאוחסן ואז לאחר מכן כאשר i יהפוך ל 1 כך 1000+1 אשר התפרש פנימית כ (1000) +1 *4 אם אני מניח שגודל המספר השלם הוא 4 בתים, והוא יהיה שווה ל- 1004, כך שהמספר השלם הבא יאוחסן בתוך 1004 מיקום. וזה ימשיך בדרך זו הכתובות הן כמו 1000, 1004, 1008 וכן הלאה. אנו לא משתמשים באמפרסנד לפני ptr+i מכיוון ש- ptr כבר נותן לנו את הכתובת כשאנחנו כותבים ptr, שהיא פשוט מצביע, והיא מכילה את הכתובת, לא את הערך, כך שאין דרישה לשים אמפרסנד לפניה, ו מושג זה צריך להיות ברור.

כאן בלולאה זו, אנו פשוט עושים דבר אחד, אנו מדפיסים את כל המספרים השלמים על המסך; ברור שאנו משתמשים ב- ptr+i, אך כאן, במקרה זה, אנו מפנים אותה מכיוון ש- ptr+i מייצג כתובת, ולכן עלינו להפנות אותה. אם אני שווה ל 0, זה יהיה 1000 מכיוון שאנו מניחים שהכתובת הראשונה תהיה 1000, ולכן אנו מפנים אותה; נקבל את המספר השלם הראשון ואז i שווה ל 1, והוא יהפוך ל 1001 אך יתפרש כ- 1004 אם גודל המספר השלם הוא 4. שוב. אנו מפנים את זה כך שזה ייתן לנו את ה -2ndמספר שלם. בדרך זו, הכל עובד.

אז זו בעצם תוכנית פשוטה שמבקשת מהמשתמשים להזין מספר n שלם, ואז אנחנו פשוט מציגים את המספרים השלמים האלה על המסך. לאחר ביצוע התוכנית, זה יוצג.

ראשית, אנו מבקשים מהמשתמש להזין את מספר המספרים השלמים, ולאחר מכן המשתמש נכנס למספרים השלמים, ואנו פשוט מציגים אותם על המסך.

סיכום:

אין שום דבר רע בתוכנית לעיל כל עוד אנו ממשיכים אותה הרבה מאוד זמן כאן אנו לווים זיכרון מהערימה, אך לעולם איננו מחזירים את הזיכרון לערימה זה קורה רק במקרה בו יש לתוכנית/יישום לרוץ לאורך זמן כמו 24 שעות. הם יקראו שוב לפונקציה malloc, ושוב זה אומר שכל פעם שהם לווים זיכרון מהערימה ולעולם לא חוזרים, זו תכנות גרוע, לכן עלינו לכתוב בחינם (כתובת הזיכרון שצריך לשחרר) לפני החזרה. אז בכל פעם ששימוש ב- malloc חינם הוא חשוב. לכן, באמצעות מאלוק, שמרנו על זיכרון, ומלקוק אכן מקצה זיכרון גדול כפי שאתה שואל אותו.

הקצאת זיכרון דינמית שמחה!