Menu
CoddyTech

שימוש ב-sizeof() להקצאה

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 33 מתוך 63.

בעוד ש־malloc() מאפשרת לך להקצות זיכרון באופן דינמי, יש כלל חשוב שמומלץ לפעול לפיו כדי שהקוד שלך יהיה נייד וקל יותר לתחזוקה: שימוש באופרטור sizeof() כדי לקבוע כמה בתים להקצות.

האופרטור sizeof() מחזיר את מספר הבתים הדרושים לאחסון סוג נתונים מסוים במערכת שלך. במקום לקודד את גדלי הבתים ישירות, אפשר לתת ל-sizeof() לחשב אוטומטית את הכמות הנכונה:

// במקום לנחש גדלים בבתים:
int *ptr = (int*)malloc(4);  // מניח ש-int הוא בגודל 4 בתים

// השתמשו ב-sizeof() כדי להבטיח ניידות:
int *ptr = (int*)malloc(sizeof(int));  // תמיד נכון

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

// הקצה מקום ל-10 מספרים שלמים
int *arr = (int*)malloc(10 * sizeof(int));

// הקצה מקום ל-5 ערכים מסוג double
double *values = (double*)malloc(5 * sizeof(double));

השימוש ב־sizeof() גורם לקוד שלך לעבוד כראוי במערכות שונות, שבהן ייתכן שלסוגי נתונים יהיו גדלים שונים, ומבהיר שכוונתך להקצות מקום למספר מסוים של איברים מסוג מסוים.

challenge icon

אתגר

קל

כתבו תוכנית C שמדגימה שימוש נכון ב־sizeof() עם malloc() להקצאת זיכרון דינמית. התוכנית שלכם צריכה:

  1. לקרוא מהמשתמש מספר שלם n שמייצג את מספר האיברים שיש להקצות
  2. להשתמש ב־malloc() עם sizeof() כדי להקצות באופן דינמי זיכרון למערך של n ערכי double
  3. להמיר את מצביע ה־void שהוחזר למצביע ל־double
  4. לקרוא מהמשתמש n ערכי double ולאחסן אותם במערך שהוקצה
  5. לחשב את סך הזיכרון שהוקצה בבתים ולהדפיס אותו בפורמט: Memory allocated: [bytes] bytes
  6. לחשב ולהדפיס את הממוצע של כל הערכים עם 2 ספרות אחרי הנקודה העשרונית בדיוק, בפורמט: Average: [value]
  7. למצוא ולהדפיס את הערך הגדול ביותר עם 2 ספרות אחרי הנקודה העשרונית בדיוק, בפורמט: Largest: [value]

זכרו לכלול את הכותר <stdlib.h> כדי להשתמש ב־malloc(). התוכנית שלכם צריכה להדגים כיצד sizeof() מבטיח הקצאת זיכרון נכונה, ללא תלות בגודל הטיפוסים במערכת.

לדוגמה, אם הקלט הוא:

3
2.5 7.8 4.1

הפלט שלכם צריך להיות:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

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

נסו בעצמכם

#include <stdio.h>
#include <stdlib.h>

int main() {
    // קראו את מספר האיברים
    int n;
    scanf("%d", &n);
    
    // TODO: כתבו את הקוד שלכם למטה
    // 1. הקצו זיכרון עבור n ערכים מסוג double באמצעות malloc() ו-sizeof()
    // 2. בצעו המרת טיפוס של המצביע שהוחזר ל-double*
    // 3. קראו n ערכים מסוג double ואחסנו אותם במערך שהוקצה
    // 4. חשבו והדפיסו את כמות הזיכרון שהוקצה בבתים
    // 5. חשבו והדפיסו את הממוצע עם 2 ספרות אחרי הנקודה העשרונית
    // 6. מצאו והדפיסו את הערך הגדול ביותר עם 2 ספרות אחרי הנקודה העשרונית
    
    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C אונליין