שלום לכולם
(שאלת CPP)

© DrorZi

New member
שלום לכולם ../images/Emo13.gif (שאלת CPP)

פעם ראשונה פה, בואו נראה אם אני "עובר מסך" פה... השאלה:
#include <iostream.h> int* getnum() { // int i=6; // return &i; int arr[] = {1,2,3,4,5,6}; return &arr[3]; } void main() { cout<<*getnum(); cout<<"\nbyebye\n"; }​
למה זה עובר קומפלציה ורץ בלי שום הארה/הערה או בעיה ואם השורות // int i=6; // return &i; היו כתובות כקוד הוא היה צועק שאני מנסה להחזיר כתובת משתנה לוקלי
ז"א אני מבין טוב למה הוא צועק את זה זה שקוף, הבעיה שאני לא רואה למה עם המערך הוא לא צועק את זה ....
דרור זי, בהופעת בכורה ...
 

© DrorZi

New member
כמו שאמרתי, אני יודע בדיוק

את המשמעות מה שאני לא מבין זה למה הקומפיילר לא נותן WARNING על המערך שגם הוא לוקלי לחלוטין.
דרור זי.
 

Zack DA

New member
אז עוד פעם, חשוב קצת על כך.

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

eyalbd

New member
הקומפיילר בכלל לא טמבל

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

© DrorZi

New member
עד כמה שאני הצלחתי להבין:

גם המשתנה וגם המערך הם לוקלים שניהם חוזרים ל HEAP כמקום פנוי בסוף הסקופ אפשר לפנות עדין עם כתובת לזכרון שלהם כי אף אחד לא דרס אותם אבל מספיקה עוד שורת קוד אחת בלבד כדי שאף אחד מהם לא יהיה קיים (אתחול מערך חדש למשל) הדרך היחידה היא להגדיר משתנה ע"י הקצאת NEW ולהחזיר אותו, הוא היחיד שלא ימחק כל עוד לא נעשה DELETE גם אם הסקופ נגמר. וזה למה מוזר לי שעל אחת הקומפיילר נותן WARNING ועל אחד לא...
דרור זי.
 

© DrorZi

New member
אולי יש בתשובתי טעות קטנה

ולא מדובר על ה HEAP אלה על ה STATIC עדין אפשר לדרוס אותו...
דרור זי.
 
למעלה