עבור לתוכן

הבדלים בין הקצאה סטטית לדינאמית

Featured Replies

פורסם

כשמקצים סטטית איפה נשמר האובייקט וכשדינמית איפה?

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

ובאובייקטים (מה ההבדל בין הקצאה סטטית למבציע על אוביקט דינאמי(NEW) ).

תודה רבה

פורסם

בכל תוכנית יש לך כמה איזורי זיכרון (segments): בין השאר - האיזור של ה-( code (TEXT, איזור המידע הסטטי (נדמה לי שקוראים לו DATA אבל אני לא בטוח), איזור המחסנית (stack) ואיזור ה- heap ('ערמה' זה שם מפגר מדי).

אני אניח שאתה מדבר על שפה כמו C++/Pascal ולא על C#, Java כי שם זה קצת שונה (אובייקטים מוגדרים תמיד ב- heap).

אם אתה מגדיר משתנה/אובייקט בתוך פונקציה בהקצאה סטטית: (תצמיד לשמאל כדי לראות את זה נורמאלי)

{

MyClass A;

}

האובייקט נשמר ב- stack.

אם אתה מגדיר משתנה/אובייקט בהקצאה דינאמית:

{

MyClass *A = new A;

}

אז מוגדר לך אובייקט ב- heap, ופוינטר אליו שנמצא ב- stack.

אם אתה מגדיר משתנה סטטי (בתוך פונקציה או מחוץ לה

static MyClass A;

אז המשתנה מוגדר באיזור המידע הסטטי.

עכשיו-

לכל מה שאתה מגדיר על ה- stack יש זמן חיים של ה- scope שבו הוא מוגדר (כלומר - משתנה שמוגדר על ה- stack בתוך פונקציה, יעלם בסוף הפוקנציה).

מחרוזות הן שונות בכל שפה, וב- C++ יש כמה סוגים. (הפרימטיבי ביותר זה char* של C)

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

אי אפשר לכתוב -

int x=GetSize();

char s[x];

אבל כן אפשר לכתוב

char* s=new char[x];

פורסם
  • מחבר

באמת תודה רבה

באשר למחרוזות יש הבדלים בפעולות על מחרזות סטטיות ודינמיות

פורסם

נדמה לי שלא.

כל פונקציה שלוקחת char* יכולה לקבל גם מערך סטטי של char, פשוט בגלל שב- C שם של מערך הוא מצביע קבוע לתחילת המערך.

מה שכן, זה פותח אותך ל- buffer overflow attacks ועל זה אתה יכול לקרוא בהרחבה כאן

פורסם

שים לב שבאמצע התוכנית אתה יכול גם לעשות

strcpy(str, "blabla");

כאשר str זה char *.

ארכיון

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

דיונים חדשים