ABA


"שאלה תאורטית ב-C : מצביעים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10566 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10566
eminem
חבר מתאריך 14.11.03
4348 הודעות, 1 פידבק, -2 נקודות
   10:22   13.01.12   
אל הפורום  
  שאלה תאורטית ב-C : מצביעים  
 
   ככל הנראה הנושא עדיין לא יושב לי טוב ואני רוצה חידוד
להן יש לי את הקטע קוד הבא

typedef struct node{
int val
struct node *next;
}node;

void add(node *list,int val)
{
node * temp=(node *)malloc(sizeof(node));
temp->val=val;
temp->next=list;
list=temp;
}

void main()
{
node *list=NULL;
add(list,1);
add(list,2);
}

השאלה פה מה יהיה
list
אחרי פעמים הפעלת הפונקציה
אז מסתבר שהוא יהיה
NULL

השינוי שצריך לעשות בפונקציה כדי שבאמת יוכנס לו ערכים


void add(node **list,int val)
{
node *temp=(node *)malloc(sizeof(node));
temp->val=val;
temp->next=*list;
*list=temp;
}

void main()
{
node *list=NULL;
add(&list,1);
add(&list,2);
}

השאלה שלי היא כזאת
במצב הראשון מה בעצם הפונקציה add מקבלת? היא יוצאת משתנה חדש מקומי list
במקום חדש בזכרון ומקצה לו NULL ובמצב השני הוא מקבל ממש את הכתובת של הרשימה? וכמו כן בשורה temp->next=list; הנקסט של טצפ בעצם מקבל NULL ולא את הכתובת של list במצב הראשון בשני ממש מקבל את הכתובת של LIST?
כלומר אם אני ארצה ממש לעשות שינויים ברשימה המקורית ולא ברמה המקומית צריך לשלוח את זה כמו במצב 2?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב D-KinG 13.01.12 11:34 1
  קצת סדר בראש... ldan192  13.01.12 20:05 2

       
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   11:34   13.01.12   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
   בפונ' add הראשונה הכל תקין חוץ מהפקודה האחרונה
list זה בעצם העתק של מה ששלחת, כלומר מצביע לאותה הכתובת
temp->next=list; זאת פקודה תקינה כי אתה אומר ל-next להצביע לכתובת ש-list מכיל (!), ולא להצביע למשתנה החדש שנוצר על המחסנית, בשביל לעשות את זה היית צריך לכתוב &list. תחשוב על זה כמו שהיית רושם int x=y; אתה מבצע השמה של הערך של y לתוך x.
הפקודה האחרונה לא תקינה כי אתה מבצע שינוי למשתנה המקומי של הפונ', מה שתיקנת בפונ' השנייה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:05   13.01.12   
אל הפורום  
  2. קצת סדר בראש...  
בתגובה להודעה מספר 0
 
נניח יש לך בשורת ה-main הראשונה מצביע.
המצביע עצמו יושב בכתובת 0x100 בזכרון ומצביע ל-NULL (כלומר 0x0).
עכשיו, אתה מעביר את ערך הפויינטר לפונקציה add.
כלומר, יש לך מצביע חדש (!), נניח בכתובת 0x200, שמצביע ל-0x0.

באיזשהו שלב, אתה לוקח את הערך המוצבע מהמצביע ב-0x200 ומשנה מ-0x0 לנניח 0x1000 (שקיבלת ב-malloc).
עכשיו אתה חוזר בחזרה ל-main. מה קיבלת? 0x100 עדיין מצביע לך לאותו 0x0!

מה שאתה צריך זה 3 אפשרויות:
א. להשתמש ב-node**, כלומר יש לך פויינטר לפויינטר (שב-0x100).
ב. במידה ולא היה מדובר ברשימה מקושרת - פשוט ליצור node ולעדכן אותו by address, כלומר להעביר node&.
ג. להשתמש ב-handle-ים (יותר רלוונטי ל-++C).

בהצלחה!


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net