פורסם 2009 בדצמבר 2715 שנים בניתי שני מבנים כאלה:typedef struct{ Node *first;} List;typedef struct{ List words;} Dictionary;(Node זה עוד איזשהו מבנה שבניתי).אבל כשאני שולח אותם לפונקציה פשוטה כמו זו:void PrintDic(Dictionary *dic){ printf("%p\n", dic->words.first);}זה מדפיס לי כתובת שונה מהכתובת האמיתית של first (שהגדרתי אותה קודם לכן), כלומר ב- main רשום כתובת שונה ובפונקציה כתובת שונה.בגלל זה אני לא יכול לגשת לתוכן של first.אני לא מבין מה אני עושה לא נכון.מישהו יכול לעזור לי?
פורסם 2009 בדצמבר 2715 שנים הבעיה שלך היא בפונקציה CreateNewDictionary.כשאתה מגדיר את המילון ככה: Dictionary d, אז הוא משתנה מקומי שנוצר על המחסנית. כשאתה יוצא מהפונקציה הנוכחית, המשתנה נמחק. למעשה, dic כרגע מצביע לאובייקט שלא קיים יותר (בעגה מקצועית זה נקרא dangling pointer).כשאתה מתעסק עם מצביעים, אתה חייב להשתמש ב-malloc/free. כלומר:Dictionary* d = (Dictionary*)malloc(sizeof(Dictionary));כמובן אתה צריך לדאוג לשחרר אותו בסוף באמצעות free (תכנון נכון כמובן הוא לעשות פונקציה בשם FreeDictionary שתעשה את זה).שים לב גם שלעשות ככה:List words;words.first = NULL;d.words = words;זה קצת מיותר - d.words כבר קיים, ואתה יכול ישר לגשת אליו, ולעשות ככה:d.words.first = NULLמה שאתה עושה כאן זה למעשה ליצור משתנה מטיפוס List, שם בו ערך מסוים, ואז מעתיק אותו לתוך d.words, כשלמעשה d.words כבר קיים ואתה יכול לכתוב ישר לתוכו.
פורסם 2009 בדצמבר 2815 שנים מחבר אה, אוקיי.תודה רבה על ההסבר והעזרה.זה מסוג הבעיות שכשעוברים מ- C# ל- C נתקלים בהם.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.