עבור לתוכן

עוד שאלה ב C

Featured Replies

פורסם

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

int main(void)

{

int na=666;

int *pna1=&na, *pna2=(int*)na;

int **ppna1=&pna1, **ppna2=&pna2;

*pna1=1;

*pna2=2;

*ppna2=pna1;

**ppna2+=10;

*ppna2+=10;

return 0;

}

בכל מקרה בלי קשר לשורת השגיאה מה עושה השורה שלפני return?

ומה בדיוק קורה אחרי שמגדירים

*pna2=(int*)na??

פורסם

דבר ראשון מה לעאזל התוכנית הזאת עושה?

דבר שני, מה זה ה**, אני מכיר רק * אחד, לפוינטרים

פורסם

השגיאה היא בשורה

*pna2=2;

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

*pna2=(int*)na

גורם לכך ש-pna מצביע לכתובת na=666 בזיכרון, אתה חייב לעשות cast בגלל ש-pna2 הוא מטיפוס int* ו-na הוא מטיפוס int

פורסם

איך יש RETURN אם הפונקציה היא VOID

ועוד דבר

הפונקציה מחשבת כל מיני דברים ובסופו של דבר לא משנה מה מחזירה 0

מה עשינו פה??

פורסם

הפונקציה היא int main ככה שחייבים להחזיר ערך. ב-C אמיתי (ansi-c) הפונקציה main חייבת להחזיר int והיא לא יכולה להיות void. כמובן שכל קומפיילר כמעט שתעבוד עליו יקבל גם void main אבל זה בגלל שהוא קומפיילר ל-C++.

זה ש-main לא עושה כלום זו לא הכוונה של התרגיל, הוא סה"כ משנה להבין משחק עם מצביעים ולא חשוב לו מה מוחזר בסוף.

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

1. int na=666;

2. int *pna1=&na, *pna2=(int*)na;

3. int **ppna1=&pna1, **ppna2=&pna2;

4. *pna1=1;

5. *pna2=2;

6. *ppna2=pna1;

7. **ppna2+=10;

8. *ppna2+=10;

אחרי שורה 3 מתקיים

na=666, pna1 pointes to na, pna2 pointes to address 666, ppna1 pointes to pna1 and ppna2 pointes to pna2.

line 4 changes na to 1 (na=1)

line 5 changes the val in address 666 to 2 (you dont own that address so this is a write error)

line 6 changes ppna2 to point to na

line 7 changes the val in address na=1 to 10+whatever was there before (once again you done own address 1 so thats a write+read error)

line 8 changes na to 10+1

פורסם
  • מחבר

תודה רבה HOLY...

פורסם

תיקון קל

1. int na=666;

2. int *pna1=&na, *pna2=(int*)na;

3. int **ppna1=&pna1, **ppna2=&pna2;

4. *pna1=1;

5. *pna2=2;

6. *ppna2=pna1;

7. **ppna2+=10;

8. *ppna2+=10;

אחרי שורה 3 מתקיים

na=666, pna1 pointes to na, pna2 pointes to address 666, ppna1 pointes to pna1 and ppna2 pointes to pna2.

line 4 changes na to 1 (na=1)

line 5 changes the val in address 666 to 2 (you dont own that address so this is a write error)

before line 6 ppna2 points to pna2 witch points to address 666

line 6 changes *ppna2(=pna2) to point to what pna1 points to. pna1 points to na so it sets pna2 to points to na. (so now ppna2->pna2->na)

line 7 changes to na=1+10

line 8 changes pna2 to point to 10+(the address of na) (This is ok while you done read/write to that address)

ארכיון

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

דיונים חדשים