Dolmiti פורסם 2018 בפברואר 7 Share פורסם 2018 בפברואר 7 האם השורות בקוד להלן חוקיות? int arr[] = {1,1,3}; int *p = arr; p+=10; /*האם חוקי*/ arr[-1]; /*האם חוקי*/ printf("%p", arr[-1]); /*האם חוקי*/ קישור לתוכן שתף באתרים אחרים More sharing options...
QttP פורסם 2018 בפברואר 7 Share פורסם 2018 בפברואר 7 הכל חוקי. C לא בודק גלישות ממערך. אולי זה יקרוס מתישהו ואולי לא. מעשית, הגדרת פה מערך בגודל 3. מן הסתם, אין הגיון לפנות לתאים שהם לא 0, 1, 2. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 7 מחבר Share פורסם 2018 בפברואר 7 זה שזה מתקמפל זה בסדר. השאלה האם ההתנהגות הזו מוגדרת בשפה? האם יש הבדל בחוקיות או בהתנהגות אם אני שם ערך בכתובת לא ידועה או רק מדפיס כתובת לא ידועה? קישור לתוכן שתף באתרים אחרים More sharing options...
QttP פורסם 2018 בפברואר 7 Share פורסם 2018 בפברואר 7 מבחינת C הכל פשוט ומוגדר היטב. מצביע הוא סה"כ מספר שהערך שלו מפורש כמו כתובת בזכרון. אפשר לבצע עליו אריתמטיקת מצביעים. אם אתה מנסה לגשת לכתובת P+X או P-X (כאשר P מצביע וX מספר), התוכנה פשוט תנסה לגשת לשם. אם יש הגנות (נגיד מנהל זכרון של המערכת) הוא יכול לזהות שאתה מנסה לגשת לכתובת שהיא לא שלך, ולזרוק אותך (segmentation fault). אם לא, אז אתה יכול פשוט לדרוס זכרון של מישהו אחר, והתוצאות תהיינה בלתי צפויות. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 7 מחבר Share פורסם 2018 בפברואר 7 אוקיי זה כעת ברור. אבל כאשר אני מקדם את פוינטר 9 צעדים קדימה. זה חוקי? אולי אין כתובת כזאת? אני גם יכול להיזרק רק בגלל p+=9 בלי לשים ערך? קישור לתוכן שתף באתרים אחרים More sharing options...
etal פורסם 2018 בפברואר 7 Share פורסם 2018 בפברואר 7 פוינטר הוא סתם מספר, לא יקרה כלום כל עוד אתה לא מנסה לגשת למה שהוא מצביע אליו. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 8 מחבר Share פורסם 2018 בפברואר 8 פוינטר הוא מספר?? סגור על זה? קישור לתוכן שתף באתרים אחרים More sharing options...
etal פורסם 2018 בפברואר 8 Share פורסם 2018 בפברואר 8 אתקן את עצמי הוא כתובת בזכרון אבל כן בסופו של דבר כתובת בזכרון היא מספר ולא הרבה יותר מזה. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 9 מחבר Share פורסם 2018 בפברואר 9 אז אם אינ מבין אותך נכון, אז בעצם אני יכול לשים כל כתובת דמיונית במצביע כלשהו. רק אם אגש לתוכן של אותה כתובת אז ייתכן ואקבל שגיאה קישור לתוכן שתף באתרים אחרים More sharing options...
etal פורסם 2018 בפברואר 9 Share פורסם 2018 בפברואר 9 כן, למה זה כל כך מפתיע אותך? קישור לתוכן שתף באתרים אחרים More sharing options...
Guy950 פורסם 2018 בפברואר 10 Share פורסם 2018 בפברואר 10 אני סתם סקרן לדעת, בלי דעות קדומות, האם אתה לומד תכנות באופן עצמאי או שאתה לומד תואר הקשור למחשבים? ככה או ככה הייתי מאוד ממליץ שתלמד לעומק את נושא המצביעים (וניהול זיכרון). C לא בודקת אותך, ומצידה אתה יכול להכניס איזה ערך שבראש שלך למצביע - אתה זה שיתמודד עם התוצאות ותשבור את הראש בלמצוא פתרון. דווקא בגלל זה אתה צריך להבין מה אתה עושה עם מצביעים, כי כמו שזה כלי טוב - זה גם דבר מסוכן. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 11 מחבר Share פורסם 2018 בפברואר 11 לומד עצמאי מנסה להבין את סוג השגיאה של פניה לכתובת שאולי קיימת, האם זה כמו שגיאה של 1+1=3 שזה חוקי לחלוטין מבחינת שפת סי, או שלמעשה באופן רשמי זה לא מוגדר לפנות לכתובת מחוץ לגבול המערך קישור לתוכן שתף באתרים אחרים More sharing options...
etal פורסם 2018 בפברואר 11 Share פורסם 2018 בפברואר 11 מבחינת c טכנית הפעולה חוקית אבל כיוון שאתה לא יודע מה שמור בכתובת הזאת אז התוצאה של הפעולה לא מוגדרת ובסביבות עבודה שונות יכולות להיות תוצאות שונות לאותה פעולה. זה יחשב לשגיאה של המתכנת אם תכתוב קוד שפונה לאינדקס שהוא מחוץ לגבולות המארך שהוקצה לך, בהרבה המקרים המערכת בכלל לא תזרוק שגיאה ואתה תצטרך לנסות להבין לבד למה התוכנית שלך נותנת תוצאות שלא התכוונת אליהן. קישור לתוכן שתף באתרים אחרים More sharing options...
Dolmiti פורסם 2018 בפברואר 11 מחבר Share פורסם 2018 בפברואר 11 תודה רבה קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.