עבור לתוכן

בעיה בשפת C-הקוד רץ, אך בזמן ההרצה אני נתקל בשגיאה

Featured Replies

פורסם

שלום לכולם:) מזה זמן מה, אני מנסה לכתוב תכנית פשוטה, המקבלת פריט בודד ל"מיניבר", כאשר הפריט כולל שם, וכמות(השדות מוגדרים בתוך מבנה).

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

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

אשמח אם תעזרו לי להבין את שורש הבעיה :kopfpatsch:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct minibar
{
char name[10];
int num;
};

typedef struct minibar minibar;
void scanf_item(minibar *p)
{
minibar *t = (minibar *)malloc(sizeof(minibar) );
if(t == NULL)
printf("Error: could not allocate memory!\n");
t=p;
printf("Enter a name:\n");
gets(p->name);
printf("Enter a num:\n");
scanf("%d", p->num);
free (t);
}

void print_item(const minibar *p)
{
printf("the name is:%s, the num is:%d", p->name, p->num);
}

int main()
{

minibar item;
scanf_item(&item);
print_item(&item);




fflush(stdin);
getchar();
return 0;
}

פורסם

מתקבלת אזהרה בזמן ההידור

ניסית לטפל בה?

moon@LapTop ~/Desktop/c++ $ g++ -o mini mini1.cc 
mini1.cc: In function ‘void scanf_item(minibar*)’:
mini1.cc:21:20: warning: format ‘%d’ expects type ‘int*’, but argument 2 has type ‘int’

פורסם

מעבר לבעיה שציין ירח אפל (שאולי היא גורמת לך לקריסה ואולי לא) יש לך גם בעיה עקרונית אחרת:

בפונקציה scanf_item אתה מקצה זיכרון (למה?), אחר-כך זורק את המצביע שקיבלת מההקצאה לפח, בכך שעושה השמה אליו ממצביע אחר (שקיבלת מבחוץ). ובסוף אתה משחרר מצביע שלא הקצית (למה?).

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

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

בכל אופן, המהדר לא הציג לי שום שגיאה.

העניין עם ההשמה-החלפתי את הסדר, כך שכעת p=t. עדיין-התוכנית ממשיכה לקרוס.

בנוסף, יכול להיות שלא ממש הבנתי את כל סיפור הקצאת הזכרון.. מישהו יכול להסביר לי בקצרה מה לא בסדר בקוד שלי, ובנוסף, להסביר לי בכמה מילים את כל נושא הקצאת הזכרון? :s05:

פורסם

הבעיה שלך היא שscanf מצפה לקבל מצביע, אבל אתה מעביר לה int.

ארכיון

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

דיונים חדשים