GammaCyber

כתיבת קוד — שיעור 33

Dynamic Memory

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T3 · בינוני400 נק'~25 דק'build
מערך דינמי ב-C (malloc/realloc)
כתבו תוכנית C שקוראת מספרים שלמים מ-stdin (מופרדים ברווחים, עד EOF), שומרת אותם במערך שגדל דינמית עם realloc, ומדפיסה אותם בסדר הפוך (מופרדים ברווח, ירידת שורה בסוף). שחררו את הזיכרון עם free.
דוגמאות
1 2 3 4 5 → 5 4 3 2 1
פתרון-ייחוס מערך דינמי ב-C (malloc/realloc) ›
#include <stdio.h> #include <stdlib.h> int main(){ int cap=2, n=0, *a=malloc(cap*sizeof(int)), x; while(scanf("%d",&x)==1){ if(n==cap){ cap*=2; a=realloc(a, cap*sizeof(int)); } // גדילה דינמית a[n++]=x; } for(int i=n-1;i>=0;i--) printf("%d%s", a[i], i?" ":"\n"); free(a); // שחרור נכון return 0; }
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני300 נק'~15 דק'analysis
זיהוי באג זיכרון
איזה סוג באג זיכרון קיים בקוד? הגישו את שם הבאג (למשל use-after-free / double-free / memory-leak / buffer-overflow). int *p = malloc(sizeof(int)); *p = 42; free(p); printf("%d\n", *p); // <-- כאן הבאג
דוגמאות
(פורמט) → שם באג מנורמל
פתרון-ייחוס זיהוי באג זיכרון ›
הזיכרון שוחרר ב-free(p), ואז נקרא שוב ב-*p → use-after-free (אומת ב-AddressSanitizer).
הפתרון נשמר מקומית אוטומטית.