הבדל מפתח - calloc לעומת malloc
בתכנות, יש צורך לאחסן נתונים. הנתונים מאוחסנים בזיכרון. מיקומי זיכרון אלה ידועים כמשתנים. לכל משתנה יש סוג מסוים. הם יכולים להיות מספרים שלמים, צפים, כפילים, תווים וכו'. ישנם גם מבני נתונים שיכולים לאחסן אוסף רציף בגודל קבוע של אלמנטים מאותו סוג. זה מערך. על המתכנת להצהיר על גודל המערך. אם המתכנת מכריז על מערך של מספרים שלמים עבור חמישה אלמנטים, לא ניתן להקצות ערך לאינדקס גבוה מהגודל המוצהר. הקצאת הזיכרון קבועה, ולא ניתן לשנות אותה בזמן הריצה.שיטת הקצאת זיכרון אחרת היא הקצאת זיכרון דינמית. הקצאת זיכרון דינמית עוזרת להקצות יותר זיכרון בעת הצורך ולשחרר בעת הצורך. לקובץ הכותרת יש ארבע פונקציות להקצאת זיכרון דינמית. calloc ו malloc הן שתי פונקציות כאלה. ההבדל העיקרי בין calloc ל-malloc הוא ש-calloc מקצה את הזיכרון וגם מאתחל את בלוקי הזיכרון שהוקצו לאפס ואילו malloc מקצה את הזיכרון אך אינו מאתחל את הזיכרון המוקצה לאפס. גישה לתוכן ב-calloc תיתן אפס, אבל malloc ייתן ערך זבל.
מה זה calloc?
הקצאת זיכרון היא תהליך הקצאת זיכרון לתוכניות המבצעות. לפעמים יש צורך לשנות את גודל הזיכרון. לכן, נעשה שימוש בהקצאת זיכרון דינמית. זה נעשה באמצעות מצביעים. מצביעים הם משתני ייחוס שמחזיקים את הכתובת של משתנה אחר.
איור 01: calloc ו-malloc
calloc מייצג "הקצאה רציפה". הוא מקצה מספר בלוקים של זיכרון באותו גודל. התחביר עבור calloc הוא כדלקמן. צריך שני טיעונים. הם מספר הבלוקים והגודל של כל בלוק. הפונקציה calloc מחזירה מצביע ריק, ולכן אופרטור cast משמש לסוג מצביע שהוחזר בהתאם לסוג הנתונים הנדרש.
voidcalloc(size_t num, size_t size);
עיין בתוכנית C הפשוטה שלהלן.
include
include
int main(){
int ptr=(int) calloc(20, sizeof(int));
if (ptr==NULL){
printf("זיכרון לא מוקצה");
}
else{
printf("זיכרון מוקצה");
}
return 0;
}
לפי התוכנית לעיל, מוקצה בלוק זיכרון רציף שיכול להכיל 20 אלמנטים. לכל אחד יהיה גודל של מספר שלם. נעשה שימוש ב-sizeof(int) מכיוון שסוג המספרים השלמים משתנה בין מהדר למהדר.
אם הקצאת הזיכרון תצליח, היא תחזיר את כתובת הבסיס של בלוק הזיכרון. זה אומר שהמצביע ptr מצביע כעת על כתובת הבסיס של בלוק הזיכרון הזה. כל האזורים שהוקצו מאותחלים לאפסים. זה ידפיס את הודעת Memory Allocated. אם הקצאת הזיכרון לא מצליחה, היא תחזיר את מצביע האפס. לכן, הוא ידפיס הודעה לא הוקצה זיכרון.
מה זה malloc?
פונקציית malloc משמשת להקצאת הכמות הנדרשת של בתים בזיכרון. התחביר עבור malloc הוא כדלקמן. הגודל מייצג את הזיכרון הנדרש בבתים.
void malloc(size_t_size);
הפונקציה malloc מחזירה מצביע ריק, אז אופרטור cast משמש לסוג מצביע שהוחזר בהתאם לסוג הנתונים הנדרש.
עיין בתוכנית C הפשוטה שלהלן עם פונקציית malloc.
include
include
int main(){
int ptr=(int) malloc (10sizeof(int));
if (ptr==NULL){
printf("זיכרון לא מוקצה");
}
else{
printf("זיכרון מוקצה");
}
return 0;
}
לפי התוכנית לעיל, יוקצה בלוק זיכרון. המצביע מצביע על כתובת ההתחלה של הזיכרון שהוקצה. המצביע המוחזר מומר לסוג מספר שלם. אם זיכרון מוקצה, הוא ידפיס הודעה שהוקצה זיכרון. אם הזיכרון לא מוקצה, מצביע null יחזור. לכן, זיכרון לא מוקצה ההודעה תודפס.
מהם הדמיון בין calloc ל-malloc?
- שתי הפונקציות הללו מוצהרות בקובץ הכותרת. זהו קובץ הכותרת הסטנדרטי של הספרייה.
- שתי הפונקציות משמשות להקצאת זיכרון דינמית.
- יש להטיל את המצביע המוחזר על ידי calloc ו-malloc לסוג הספציפי.
- בהקצאת זיכרון מוצלחת, שתי הפונקציות יחזירו מצביע עם כתובת הבסיס של בלוק הזיכרון.
- אם הקצאת הזיכרון לא מצליחה, יוחזר מצביע אפס.
מה ההבדל בין calloc ל-malloc?
calloc לעומת malloc |
|
calloc היא פונקציה להקצאת זיכרון דינמית בקובץ כותרת stdlib.h בשפת C המקצה מספר מסוים של בתים ומאתחל אותם לאפס. | malloc היא פונקציה להקצאת זיכרון דינמית בקובץ כותרת stdlib.h בשפת C המקצה מספר מסוים של בתים. |
משמעות | |
calloc מייצג הקצאה רציפה. | malloc מייצג את הקצאת זיכרון. |
תחביר | |
calloc עוקב אחר תחביר הדומה ל-void calloc(size_t_num, size_t size); | malloc עוקב אחר תחביר הדומה ל-void malloc(size_t_size);. |
מספר הטיעונים | |
calloc לוקח שני ארגומנטים. מדובר במספר בלוקים ובגודל של כל בלוק. | malloc לוקח טיעון אחד. זה מספר בתים. |
Speed | |
calloc לוקח קצת יותר זמן מאשר malloc. זה בגלל השלב הנוסף של אתחול הזיכרון המוקצה באפס. | malloc מהיר יותר מ-calloc. |
סיכום – calloc vs malloc
בהקצאת זיכרון סטטית באמצעות מערכים, הזיכרון קבוע. אם מאוחסנים מעט אלמנטים, אזי שאר הזיכרון מתבזבז. זה עלול גם לגרום לשגיאות כאשר הזיכרון המוקצה קטן מהזיכרון הנדרש. לכן, נעשה שימוש בהקצאת זיכרון דינמית. בשפת C, calloc ו-malloc מספקים הקצאת זיכרון דינמית. ההבדל בין calloc ל-malloc הוא ש-calloc מקצה זיכרון וגם מאתחל את בלוקי הזיכרון שהוקצו לאפס בעוד malloc מקצה את הזיכרון אבל לא מאתחל את בלוקי הזיכרון לאפס. Malloc לוקח שני ארגומנטים ואילו Calloc לוקח שני ארגומנטים.
הורד את ה-PDF של calloc vs malloc
ניתן להוריד את גרסת ה-PDF של מאמר זה ולהשתמש בה למטרות לא מקוונות לפי הערת ציטוט. אנא הורד את גרסת ה-PDF כאן: ההבדל בין calloc ל-malloc