מת"ם 3 נדבר על :מבנים והקצאה דינמית -1מבנים – STRUCT נרצה להגדיר מה זה סטודנט מבחינת מרצה בקורס מת"ם: –שם פרטי –שם משפחה –תעודת זהות –ציון תרגילי בית –ציון מבחן –ציון סופי מה זה סטודנט מבחינת פרופ" לרפואה: –שם –כרטיס אשראי –מחלה –עבר רפואי איך נגדיר סטודנט במת"ם בספת ? C {typedef struct student ;]char 1name [20 ;]char 2name[30 ;long id ;float HW_grade char EXAM_grade; //char a number between 0255 - enough ;char final_grade; } Tel_Hai_Student סיכום :1
: typedef ניתן להגדיר סוגים חדשים של משתנים ע"י שימוש ב typedef
שם חדש
typedef
int
סוג new_int;
new_int new // same as int new; דוגמה #include <stdio.h> typedef struct student{ …
אותם השדות יופיעו פה {Tel_Hai_Student;
void main() { Tel_Hai_Student moshe; Tel_Hai_Student *olga; Tel_Hai_Student arr_stud[15]; moshe.Exam_grade=100; //ישנה את הציון של משה ל 100 Arr_stud[2].HW_grade=30; (*olga).Exam_grade=100; ()כתיבה שקולה
olga->Exam_grade=100; ?מה קורה בזכרון בעת הגדרת המבנה נניח הגדרנו
Tel_Hai_Student moshe;
מקצה מקום בזכרון בגודל סה"כ גודל השדות 20*1byte + 30*1byte + 4byte + … + 1byte Name1
name2
final_grade בתים60 סה"כ מקצה
Tel_Hai_Student *olga; 4byte מקצה :שימו לב כאשר מגדירים Type *name; ( בתיםsizeof(int הוא מוגדר להיות כתובת עבורו מוקצהName :למשל Int* int_name; בתים כי זה פוינטר למשל4 מוקצה Char *char_name; // בתים כי זה פוינטר4 גם מוקצה Tel_Hai_Student *THS_name; // בתים כי זה פוינטר4 גם מוקצה :נסתכל על הדוגמה עם הפרופ" לרפואה typedef struct{ char *name; double credit_card_number; char* desease_name; struct past_condition{ //עבר רפואי int num_of_red_balls;
…… } }student_for_doctor; union ( )איגוד:סוג נוסף של מבנה typedef union { char c_val; 1byte char *str; 4byte float f_val;}union_type; 4byte union_type example; מוקצה זיכרון בגודל של השדה הגדול ביותר 4byte במקר שלנו יוקצה זכרון example.c_val=7; example.f_val=8.2; :הקצאה דינמית ?מתי משתמשים :1 דוגמה #include.. void main() { int N; int arr[N]; טעות scanf(“N: %d”&N);
} !אי אפשר לעשות זאת כי זה נעשה בזמן ריצה כאשר צריך להקצות מקום בגודל שלא ידוע לפני ריצת התוכנית משתמשים בהקצאה דינמית. ישנן 4פונקציות המנהלות הקצאה דינמית ושחרור של הזכרון (memory allocation) malloc )void* malloc(size אופן הפעולה – מבקשת ממערכת הפעלה מספר בתים השווה ל- SIZEמחזירה פוינטר להתחלת שטח הזכרון שמצאה או NULLאם נכשלה דוגמה: ;char* line הקצה עבורו מקום בגודל 80בתים line = (char *)malloc(80); ) ( casting דרך אחרת: ;))line= (char *)malloc(80*sizeof(int byte320יוקצה calloc: void *calloc(N , S) – Nמס האלמנטים – Sגודל של כל אלמנט זהה ל MALLOCרק שהיא מאפסת את המערך
מקצה מחדש שטח void *realloc(void *block, int size); בזכרון פעולה יקרה -יש להשתמש בה כמה שפחות כתובת התחלת הבלוק הישן – void *block הגודל החדש שנדרש – int size פעולה אחרונהFREE : פונקציה משחררת את הזכרון שהוקצה להיזהר עם – FREEלא לשחרר פעמיים את אותו הפוינטר – לא האם לבדור תמיד – NULL שהוא פוינטר לשחרר malloc/calloc/reallocהצליחו!