עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ארור מוזר בשפת 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:

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.