פורסם 2012 בינואר 1113 שנים היי,לתכנית מערך סטטי שבו מחרוזת דינמית שעושה קלט פשוט של מחרוזת ומכניסה אותה לתא הראשון..התכנית קורסת בקלט המחרוזת ואני לא מבין למה.#include <stdio.h>#include <string.h>#include <stdlib.h>#define NUM 100char * 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]); } }}
פורסם 2012 בינואר 1113 שנים אתה בטוח שהקריסה היא בדיוק ב-gets ולא במקום יותר מאוחר?שים לב שהלולאה של free משחררת תאים שלא הקצית...אתה מנסה להכניס מחרוזת לתוך תואיפה?אגב, אתה לא אמור לעשות return בלי כלום (אם לפונקציה יש ערך החזרה). אם אתה לא רוצה להחזיר כלום, תחזיר NULL. מוזר שהקומפיילר לא הזהיר אותך על זה.
פורסם 2012 בינואר 1113 שנים נתחיל בזה -gets is an error waiting to be calledהפונקציה הזו מסוכנת, קל לדרוס איתה זכרון. אני מציע שלא תשתמש בה.2-טעות קלאסית - לערבב פונקציות קלט שונות, בעלות התנהגות שונה.אני *מניח* שזה מה שקרה - תצטרך לאמת עם הקומפיילר שלך -scanf של %d תקלוט את המספר ותעצור מיד אחריו, ותשאיר את שאר שורת הקלט untouched.לאחריה אתה למעשה מפעיל את gets על השאר (האנטר שלך).בתמורה קיבלת מחרוזת ריקה, שלא עברה את בדיקת הקלט שלך.ה return הריק על פונקציה שאמורה להחזיר משהו גרם למשהו לא צפוי.אם במקרה זה עוד "הוחלק" איכשהו עד כה - כשתנסה לעשות free לכתובת הזו תקבל segfault מכאן ועד הודעה חדשה.יש יותר משגיאה אחת בתיאור התהליך הזה, אני מציע שתשב ותחשוב איפה הן היו.חוצמזה - אני ממליץ בחום על ניסוי וטעיה כזה עם debug צמוד. אתה תלמד הרבה יותר משגיאות של עצמך מאשר מקוד שעובד.
פורסם 2012 בינואר 1213 שנים אולי אם היית מסביר מה היית רוצה שיקרה בתוכנית היה יותר ברור איך לכוון אותך לתשובה.את השגיאות שלך אתה כבר יודע (החבר'ה לפניי הסבירו את זה מצוין) אולי תפרט קצת את המטרה שלך ונוכל לקבל מושג יותר טוב
פורסם 2012 בינואר 1213 שנים תשתמש ב debugger , זה יחסוך לך הרבה זמן. אחרי 2 דקות ו stack trace אחד, זה מה שמקריס אותך: free(arr[i]);אתה עושה free לכתובת שנמצאת בתא ה i של arr... וחוץ מ 0 כל השאר זה זבל על ה stack. אה כן ו arr צריך להיות char** אם אתה רוצה לשמור char* בכל אינדקס...ואני מסכים לגמרי עם עוד אחד לגבי gets, וגם scanf האמת די מחורבנת. נסה את fgets.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.