שאלה על malloc

CharlyBoO

New member
שאלה על malloc

שלום!
רציתי לבקש הסבר קטן לגבי malloc.
במידה ואני רוצה לקלוט למבנה עם שדות שונים (למשל name, ID), ועל מבנה זה מצביע שדה info ממבנה אחר.

קלטתי עם gets את הID ואת הNAME.

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

תודה!
 

CharlyBoO

New member
או רק הסבר איך כותבים מלוק בכללי

אני לא מבינה את מה שמים איפה בשורת הכתיבה.
מצויין בכוכביות.


********=(********)malloc(sizeof(*********)**********);

תודה
 

Guy Yafe

New member
לא ברור מה את מנסה לעשות

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

ptr = (int*) malloc(sizeof(int));

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

CharlyBoO

New member
אוקיי..תודה! אז אפשר לרשום ככה-->

נגיד ככה?
Name=(char*)malloc(sizeof(char)*(strlen(Name)+1));

(שימוש במחרוזת)

ומתי אני עושה לו FREE?


תודה רבה!
 

Guy Yafe

New member
הכתיבה שלך נכונה

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

CharlyBoO

New member
סבבה מעולה! אבל איך מעתיקים מחרוזת לשם?

כאילו.......אין לי צורך בו כשכבר העתקתי את המחרוזת שלי?
איך אני מעתיקה אותה למקום של ההקצאה? כי הgets קיבל את זה לNAME אבל זה לא שם אחרי ההקצאה.
 

Guy Yafe

New member
לאן את קוראת עם gets?

השדות ID ו - NAME: האם הם מצביעים כלשהם שיש לעשות להם אלוקציה, או שאלה ממש מערכים בגודל מסויים?
אם התשובה השניה, ואת פשוט קוראת עם gets אל תוך המחרוזות האלה, אין לך שום צורך ב - malloc.
אם התשובה הראשונה נכונה, ואת צריכה לעשות אלוקציה דינמית בכל קריאה, פשוט תעתיקי באמצעות פונקציית ההעתקה החביבה עלייך.
 
למעלה