עבור לתוכן

שפת C גלישה ממערך

Featured Replies

פורסם

האם השורות בקוד להלן חוקיות?

 

int arr[] = {1,1,3};
int *p = arr;
p+=10; /*האם חוקי*/
arr[-1]; /*האם חוקי*/
printf("%p", arr[-1]); /*האם חוקי*/

 

פורסם

הכל חוקי. C לא בודק גלישות ממערך. אולי זה יקרוס מתישהו ואולי לא.

 

מעשית, הגדרת פה מערך בגודל 3. מן הסתם, אין הגיון לפנות לתאים שהם לא 0, 1, 2.

פורסם
  • מחבר

זה שזה מתקמפל זה בסדר. השאלה האם ההתנהגות הזו מוגדרת בשפה? האם יש הבדל בחוקיות או בהתנהגות אם אני שם ערך בכתובת לא ידועה או רק מדפיס כתובת לא ידועה?

פורסם

מבחינת C הכל פשוט ומוגדר היטב. מצביע הוא סה"כ מספר שהערך שלו מפורש כמו כתובת בזכרון. אפשר לבצע עליו אריתמטיקת מצביעים. אם אתה מנסה לגשת לכתובת P+X או P-X (כאשר P מצביע וX מספר), התוכנה פשוט תנסה לגשת לשם. אם יש הגנות (נגיד מנהל זכרון של המערכת) הוא יכול לזהות שאתה מנסה לגשת לכתובת שהיא לא שלך, ולזרוק אותך (segmentation fault). אם לא, אז אתה יכול פשוט לדרוס זכרון של מישהו אחר, והתוצאות תהיינה בלתי צפויות.

פורסם
  • מחבר

אוקיי זה כעת ברור. אבל כאשר אני מקדם את פוינטר 9 צעדים קדימה. זה חוקי? אולי אין כתובת כזאת? אני גם יכול להיזרק רק בגלל p+=9 בלי לשים ערך?

פורסם

פוינטר הוא סתם מספר, לא יקרה כלום כל עוד אתה לא מנסה לגשת למה שהוא מצביע אליו.

פורסם
  • מחבר

פוינטר הוא מספר?? סגור על זה?

פורסם

אתקן את עצמי הוא כתובת בזכרון אבל כן בסופו של דבר כתובת בזכרון היא מספר ולא הרבה יותר מזה.

פורסם
  • מחבר

אז אם אינ מבין אותך נכון, אז בעצם אני יכול לשים כל כתובת דמיונית במצביע כלשהו. רק אם אגש לתוכן של אותה כתובת אז ייתכן ואקבל שגיאה

פורסם

כן, למה זה כל כך מפתיע אותך?

פורסם

אני סתם סקרן לדעת, בלי דעות קדומות, האם אתה לומד תכנות באופן עצמאי או שאתה לומד תואר הקשור למחשבים?

ככה או ככה הייתי מאוד ממליץ שתלמד לעומק את נושא המצביעים (וניהול זיכרון).

 

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

דווקא בגלל זה אתה צריך להבין מה אתה עושה עם מצביעים, כי כמו שזה כלי טוב - זה גם דבר מסוכן.

פורסם
  • מחבר

לומד עצמאי
מנסה להבין את סוג השגיאה של פניה לכתובת שאולי קיימת, האם זה כמו שגיאה של 1+1=3 שזה חוקי לחלוטין מבחינת שפת סי, או שלמעשה באופן רשמי זה לא מוגדר לפנות לכתובת מחוץ לגבול המערך

פורסם

מבחינת c טכנית הפעולה חוקית אבל כיוון שאתה לא יודע מה שמור בכתובת הזאת אז התוצאה של הפעולה לא מוגדרת ובסביבות עבודה שונות יכולות להיות תוצאות שונות לאותה פעולה. זה יחשב לשגיאה של המתכנת אם תכתוב קוד שפונה לאינדקס שהוא מחוץ לגבולות המארך שהוקצה לך, בהרבה המקרים המערכת בכלל לא תזרוק שגיאה ואתה תצטרך לנסות להבין לבד למה התוכנית שלך נותנת תוצאות שלא התכוונת אליהן. 

פורסם
  • מחבר

תודה רבה

ארכיון

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

דיונים חדשים