עבור לתוכן

מקבל שגיאת ריצה בהדפסת איבר ברשימה מקושרת

Featured Replies

פורסם

איך יש לך בהתחלה שני צמתים? כמה פעמים עשית new?

אני לא שואל כמה משתנים או כמה מצביעים יש. אני שואל כמה אובייקטים יש. כל פעם שאתה עושה new - נוצר אובייקט חדש.

  • תגובות 43
  • צפיות 8k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

אז יש לי אובייקט אחד בהתחלה ואחרי זה יש לי 2 אובייקטים, כל פעם שאני מוסיף איבר לרשימה אני לפני זה יוצר צומת חדשה

פורסם

אוקי. בהתחלה יש לך אובייקט אחד בלבד. מה ה-next שלו? מה ה-data שלו? מה יקרה אם תנסה להדפיס את הרשימה ככה?

פורסם
  • מחבר

בהתחלה בלי שאני מוסיף תוכל הnext של הhead הוא null אבל אז הלולאה לא אמורה לרוץ כי שמתי תנאי, תרוצי כל עוד temp שונה מnull

זה אומר שהיא לא אמורה לרוץ... הלולאה אני מתכוון..

והdata של הhead בהתחלה גם null כי לא הצבתי לתוכו אובייקט.. ואם אני אנסה להדפיס ברור שיגרור לי שגיאת ריצה, מאחר וhead בפעם הראשונה לא מכיל כלום

פורסם
  • מחבר

רגע רגע רגע , תעשו לי קצת סדר :) שאני יוצא אובייקט, אני עושה לו new הוא מקצה לאותו אובייקט זיכרון בheap זה אני יודע , אבל אם לא עדכנתי לתוכו כלום אז הוא null

אין בו כלום..

כל אובייקט שאני יוצר ולא עדכנתי לתוכו ערכים, אני מתכוון רק הקצאתי לו זיכרון אז הוא מכיל null עד שאני מכניס לתוכו נתונים

זה לא נכון ?

פורסם

לא.

אולי התת-אובייקטים שלא הם null, אבל ברגע שעשית new, האובייקט עצמו הוא לא null.

פורסם
  • מחבר

אז מה יש בתוך האובייקט שהקצאתי לו זיכרון השניה?

פורסם

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

פורסם
  • מחבר

אבל אם אני לא עשיתי בנאי למשל, ואני יודע שc# משתמש בבנאי הדיפולטי שלו ואז מה הוא שם באובייקט, במה הוא מאתחל אותו בדיוק?

פורסם

בנאי ברירת המחדל קורא לבנאי ברירת המחדל של מחלקת האב, אם יש כזה, וכו'.

אם בכל השרשרת אין בנאים כלל, תקבל אתחול "ריק" - כלומר הזכרון של האובייקט יאותחל, אך השדות לא יאותחלו ויישארו עם ערכי ברירת המחדל שלהם: null עבור כל מה שהוא reference type וערך ברירת המחדל לvalue types (לטיפוסים הבסיסיים זה לרוב 0).

פורסם
  • מחבר

אז אם יצרתי אובייקט ובתוכו יש 2 פרמטרים מסוג string? זה אומר שהאובייקט מאותחל בדינאמי ו2 הפרמטרים הפנימיים מאותחלים באפס במקטע המחסנית?

ומה ההבדל בין ריק לnull

אף פעם לא הבנתי מה ההבדל...

פורסם

אתה זורק פה כל מיני דברים לא קשורים לאוויר (מה קשורה המחסנית? מה זה "דינאמי"?) ומבלבל מונחים.

למחלקה אין פרמטרים. פרמטרים (או ארגומנטים) זה מה שאתה מעביר לפונקציה. למחלקה יש שדות. כל שדה שלא שמת לא ערך כלשהו מאותחל לערך ברירת מחדל, כמו ש-qttp אמר. אם לדוגמה יש לך מחלקה שיש לה שני שדות מטיפוס string ועוד שדה מטיפוס int, אז כשתיצור מופע של המחלקה, ערכי המחרוזות של המופע הזה יהיו null, והערך של ה-int יהיה 0 - אלא אם תשים להם ערך אחר בבנאי.

המחסנית בכלל לא קשורה כאן. המחסנית מחזיקה רק משתנים מקומיים. אם נגיד אתה עושה כזה דבר:

MyClass x = new MyClass()

אז המשתנה x מוגדר מקומית ונמצא על המחסנית, אבל הוא מצביע לאובייקט שנמצא ב-heap.

נערך על-ידי שניצל

פורסם
  • מחבר

מקטע הזיכרון הדינאמי זה הheap, ומקטע המחסנית זה הlocal איפה שמאוכסנים המשתנים הפרמיטיבים

אני ממש לא מבלבל

http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx

- - - תגובה אוחדה: - - -

אני חשבתי שקוראים למשתנים שהם value types פרמטרים... ולפי מה שאני קראתי משתנים של מחלקה נקראים members או fields

פורסם

value type זה משתנים פרימיטיביים (ו-struct, אבל לא ניכנס לזה). זה לא קשור לפרמטרים של פונקציות - פרמטרים יכולים להיות value type או reference type.

שדות של מחלקה אכן נקראים fields. המונח members כולל גם שדות וגם שיטות (methods) של המחלקה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים