קריסת תוכנית-הקצאה דינמית C. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

קריסת תוכנית-הקצאה דינמית C.


omfir

Recommended Posts

היי,

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

התכנית קורסת בקלט המחרוזת ואני לא מבין למה.





#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM 100
char * Add()
{
char temp[256];
char *res;
puts("Enter Name");
gets(temp);
if(temp[0]== '\0')
return;
res=(char*)malloc(strlen(temp)+1);
strcpy(res,temp);
return res;

}
void main()
{
int i,option;
char *arr[NUM];
printf("Choose an option");
scanf("%d",&option);
switch(option)
{
case 1:
{
arr[0]=Add();
for(i=0;i<NUM;i++)
free(arr[i]);
}
}

}




קישור לתוכן
שתף באתרים אחרים

אתה בטוח שהקריסה היא בדיוק ב-gets ולא במקום יותר מאוחר?

שים לב שהלולאה של free משחררת תאים שלא הקצית...

אתה מנסה להכניס מחרוזת לתוך תו

איפה?

אגב, אתה לא אמור לעשות return בלי כלום (אם לפונקציה יש ערך החזרה). אם אתה לא רוצה להחזיר כלום, תחזיר NULL. מוזר שהקומפיילר לא הזהיר אותך על זה.

קישור לתוכן
שתף באתרים אחרים

נתחיל בזה -gets is an error waiting to be called

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

2-

טעות קלאסית - לערבב פונקציות קלט שונות, בעלות התנהגות שונה.

אני *מניח* שזה מה שקרה - תצטרך לאמת עם הקומפיילר שלך -

scanf של %d תקלוט את המספר ותעצור מיד אחריו, ותשאיר את שאר שורת הקלט untouched.

לאחריה אתה למעשה מפעיל את gets על השאר (האנטר שלך).

בתמורה קיבלת מחרוזת ריקה, שלא עברה את בדיקת הקלט שלך.

ה return הריק על פונקציה שאמורה להחזיר משהו גרם למשהו לא צפוי.

אם במקרה זה עוד "הוחלק" איכשהו עד כה - כשתנסה לעשות free לכתובת הזו תקבל segfault מכאן ועד הודעה חדשה.

יש יותר משגיאה אחת בתיאור התהליך הזה, אני מציע שתשב ותחשוב איפה הן היו.

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

קישור לתוכן
שתף באתרים אחרים

אולי אם היית מסביר מה היית רוצה שיקרה בתוכנית היה יותר ברור איך לכוון אותך לתשובה.

את השגיאות שלך אתה כבר יודע (החבר'ה לפניי הסבירו את זה מצוין) אולי תפרט קצת את המטרה שלך ונוכל לקבל מושג יותר טוב

קישור לתוכן
שתף באתרים אחרים

תשתמש ב debugger , זה יחסוך לך הרבה זמן. אחרי 2 דקות ו stack trace אחד, זה מה שמקריס אותך:

 free(arr[i]);


אתה עושה free לכתובת שנמצאת בתא ה i של arr... וחוץ מ 0 כל השאר זה זבל על ה stack.

אה כן ו arr צריך להיות char** אם אתה רוצה לשמור char* בכל אינדקס...

ואני מסכים לגמרי עם עוד אחד לגבי gets, וגם scanf האמת די מחורבנת. נסה את fgets.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...