עבור לתוכן

ארור מוזר בשפת C

Featured Replies

פורסם

בסוף פונקציה אחרי הRETURN (בשורה של '{' ) הוא נותן לי את הארור הזה

Run-Time Check Failure #2 - Stack around the variable 'value' was corrupted.

ואין לי מושג מה גורם לזה בתוך הפונקציה יש לי עבודה של קריאה מקובץ למערך ובסוף אני מחזיר 1. הוא קורא מסיים את הקריאה של הקובץ בצורה טובה וסוגר את הקובץ. עובר את ה RETURN 1 ואחרי זה נותן את הארור. מה הבעיה?

פורסם

שנה את 1 ל 0 שאתה מחזיר 0 זה אומר שהתוכנה הסתיימה בהצלחה אם לא זה אומר שהיתה שגיאה

פורסם

יש לך מקרה קלאסי של buffer overflow. בקריאה שלך לתוך המערך אתה כנראה גולש מעבר לגבולות המערך.

קח לדוגמה את הקוד הבא:

char s[10];
scanf("%s", s);

אם המשתמש מכניס מחרוזת באורך 20, אז 10 התווים הראשונים ייכנסו לתוך המערך, ו-10 התווים הבאים (ליתר דיוק 11, כולל ה-0\) ידרכו על זכרון מעבר לגבולות המערך.

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

johnduo - הפונקציה שקוראת מתוך הקובץ מחזירה 1, לא התכנית.

פורסם
  • מחבר

לא סביר, עשיתי על זה DEBUG ואין כלום.

קוד?

בבקשה:

int readFile(char file_name[],treeA ts[])
{
FILE *fin;
char value;
int i=0,sons_num;


fin=fopen(file_name,"r");
if(fin==NULL || feof(fin))
{
return 0;
}
while(!feof(fin))
{
fscanf(fin,"%d",&value);
settsinfo(&(ts[i]),value);

fscanf(fin,"%d\n",&sons_num);
setnumsons(&(ts[i]),sons_num);

i++;
}
fclose(fin);
return /*i*/1;
}

ts - מערך בגודל 100

ויש 18 שורות בקובץ, משמע 18 תאים מתמלאים.

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

פורסם

הנה הבעיה שלך:

fscanf(fin,"%d",&value);

הטיפוס של value הוא char, ואתה קורא לתוכו כאילו הוא int.

פורסם
  • מחבר

אבל יש שם CASTING לא מפורש..

בכל אופן שיניתי את זה, עובד. תודה.

פורסם

ה-casting שיש שם הוא בין מצביעים, ולא בין int ו-char.

זה נובע מכך שהפונקציה scanf לא יודעת את הטיפוסים שהיא מקבלת - היא פשוט מקבלת רשימה של מצביעים (*void), ומתייחסת אליהם לפי מה שהיא קיבלה ב-format string.

תחשוב על הקוד הזה:

char value;
int* p = &value;
*p = 0;

השורה הראשונה דואגת להקצות בית אחד בלבד עבור value.

השורה השנייה אולי תגרור אזהרה, אבל היא חוקית לחלוטין ב-C.

בשורה השלישית, התכנית לא יודעת ש-p מצביע על מקום בזכרון שהוקצה בו רק בית אחד. מבחינתה, ב-p יושב int שהוא 4 בתים, ולכן היא תשים 0 בארבעת הבתים (ותגרום לדריכת זכרון כמו בתכנית שלך).

פורסם
  • מחבר

סבבה, תודה על ההסבר :xyxthumbs:

ארכיון

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

דיונים חדשים