פורסם 2008 במאי 2117 שנים struct data1 {int size ;char *Data1 ;char Data2[1000] ;};int _tmain(int argc, _TCHAR* argv[]){data1 mydata ;mydata.Data1 = (char *) malloc(100*sizeof(char));printf("size of data is %d",sizeof(mydata));int stam=getchar() ; return 0;}הגודל שאני יקבל זה 1008 כאשר אני יריץ את הקוד האם יש דרך להגיר שגם הפוינטר הראשון DATA1 יכניס גם בגודל של ה STRUCT או שזה חייב להיות סטטי .
פורסם 2008 במאי 2117 שנים sizeof על מצביע מחזירה את גודל המצביע, לא את הגודל של מה שהוא מצביע עליו.באותה צורה, אם המבנה מחזיק מצביע, אז sizeof של המבנה יכלול את הגודל של המצביע (שהוא 4), לא משנה על מה הוא מצביע.
פורסם 2008 במאי 2117 שנים מחבר אני יחדד את השאלה שלי ...הכוונה שאני היצלחתי לחבר ל STRUCT זיכרון של 1000 ביטים סטטים וזה מוכל בגודל הסטקט השאלה שלי עם אני יכול לעשות זאת עם גודל דינמי .האי למעשה גם DATA 1 ו DATA 2 מצבעים ו זיכרון של DATA2 ממש מוכל בגודל ה סטרקט למה אני לא יכול להכיל גם זיכרון דינמי לסטרקט ...ו
פורסם 2008 במאי 2117 שנים אי אפשר לדעת את הגודל של זכרון שהוקצה אחרי שהוא הוקצה. אתה צריך בשביל זה לשמור את הגודל שלו במשתנה נוסף.
פורסם 2008 במאי 2117 שנים מחבר שוב אני יחזז את השאלה ...1000 ביטים של DATA2 מכולה בגודל של הסטרקט עכשיו יודע ש גם DATA1 וגם DATA2 הם סך הכול פוינטרים שניתן לגשת עלהם ...למה DATA2 הסטרקט שומר את הזיכרון של DATA 2 כחלק מהסטרקט ואילו DATA1 זה לא קח האי שינהם הם פוינטרים לא ?
פורסם 2008 במאי 2117 שנים DATA2 הוא לא פוינטר. הוא מערך סטטי, שהגודל שלו ידוע בזמן הקומפילציה. זה ההבדל ביניהם.הפונקציה sizeof פשוט מחזירה את הגודל של הטיפוס בזכרון. היא לא טורחת לעקוב אחרי מצביעים, פשוט כי זה לא המטרה שלה.בזכרון עצמו, אובייקט מהטיפוס הזה ייראה ככה:| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ... | 1007 || <-- size --> | <-- Data1 --> | <---------- Data2 ---- ... -----> |כלומר 4 הבתים הראשונים שמורים ל-size, ארבעת הבתים הבאים שמורים ל-Data1, ו-1000 הבתים הבאים ל-Data2.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.