Deathrash666 Δημοσ. 27 Μαρτίου 2012 Δημοσ. 27 Μαρτίου 2012 Παιδια εχω το εξης προβλημα εφτιαξα ενα προγραμμα που να παιρνει συμβολοσειρες και να τις αποθηκευει δυναμικα σε μια συμβολοσειρα με τον χαρακτηρα '/n' στο τελος. Ενω τρεχει κανονικα καποιες φορες crashαρει στο τελος πανω στην system("pause")!! > #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char name[20]; char *names=NULL; char *moreNames; int i,totalSize=0; while(true) { printf("Give Name:"); gets(name); if(*name=='0') break; totalSize=totalSize+strlen(name)+1; moreNames=(char *)realloc(names,totalSize);//Auksanoume to string names names=moreNames; //kata to strlen +1 gia to '\n' for(i=0;i<strlen(name);i++) //Perasma tou name sto string name *(names+totalSize-strlen(name)-1+i)=*(name+i); *(names+totalSize-strlen(name)-1+i)='\n'; printf("Current String:\n"); //Ektupwsh olou tou periexomenou for(i=0;i<totalSize;i++) //tou names mexri twra printf("%c",*(names+i)); } *(names+totalSize)='\0'; printf("Ran 1\n"); puts(names); printf("Ran 2\n"); system("pause"); printf("Ran 3\n"); //getchar(); return 0; } Τι μπορει να φταιει? Με την getchar() δουλευει μια χαρα απλα παντα χρησιμοποιω system("pause") και ποτε δεν μου εβγαλε προβλημα... Συγκεκριμενα αν δωσω 4 φορες τη συμβολοσειρα awd το κανει... Επισης να προσθεσω οτι στο debugging τρεχει κανονικα χωρις crash...
migf1 Δημοσ. 27 Μαρτίου 2012 Δημοσ. 27 Μαρτίου 2012 Ο κώδικας είναι γραμμένος πολύ συμπυκνωμένα με αποτέλεσμα να μην είναι καθόλου ελκυστικός για να ασχοληθεί να τον διαβάσει κάποιος (ή τουλάχιστον εγώ). Αν είσαι σε Windows, το system("pause") δεν δημιουργεί κανένα πρόβλημα! Προφανώς κάπου αλλού σκάει ο κώδικάς σου, κι απλά εμφανίζεται εκεί. Μερικές γενικές μόνο παρατηρήσεις: α) όταν κάνεις realloc() να ελέγχεις πρώτα αν απέτυχε με κάποιον προσωρινό δείκτη, κι αν αυτός ΔΕΝ γίνει NULL, τότε και μόνο τότε να αναθέτεις τον κανονικό σου δείκτη στον πετυχημένο προσωρινό. Αλλιώς αν αποτύχει η realloc() πάνω στον κανονικό σου δείκτη, τον κάνει NULL κι οποιαδήποτε μετέπειτα αναφορά σε αυτόν δίνει seg-fault. β) το realloc() δεν εγγυάται πως θα σου επιστρέψει τη νέα μνήμη ως συνέχεια της παλιάς, μπορεί κάλλιστα να σου επιστρέψει μια τελείως νέα διεύθυνση. Οπότε αν τυχόν χρησιμοποιείς κάνα δείκτη-μετρητή πριν την realloc, τότε θα πρέπει να τον ενημερώνεις μετά την κλήση της realloc (ώστε να πάει κι αυτός στην νέα περιοχή). γ) χρησιμοποίησε τον debugger του compiler σου!
imitheos Δημοσ. 27 Μαρτίου 2012 Δημοσ. 27 Μαρτίου 2012 > *(names+totalSize)='\0'; Συμφωνώ με τα σχόλια του migf1 και παραβλέπω την ποιότητα του κώδικα και το γεγονός ότι χρησιμοποιεί gets. Όσον αφορά το crash, μια πιθανή αιτία είναι η παραπάνω γραμμή.
Deathrash666 Δημοσ. 27 Μαρτίου 2012 Μέλος Δημοσ. 27 Μαρτίου 2012 Δεν εβαλα ελεγχους για NULL δεικτες τους σε αυτο εχεις δικιο migf1 απλα με παιδεψε πολυ ο κωδικας και εβγαλα ολους τους ελεγχους τετοιου στυλ για να μην με μπερδευουν... Ευχαριστω παντως οντως ηταν η γραμμη *(names+totalSize)='\0'; ηθελε και ενα -1 εκει γιατι εβγαινα εξω απο τα ορια μνημης που μ εδεινε η realloc! imitheos η ποιοτητα του κωδικα τι προβλημα εχει? :S Επισης για της gets() ετσι μας μαθαν στη σχολη τι αλλο μπορω να κανω? :S
migf1 Δημοσ. 27 Μαρτίου 2012 Δημοσ. 27 Μαρτίου 2012 Δεν εβαλα ελεγχους για NULL δεικτες τους σε αυτο εχεις δικιο migf1 απλα με παιδεψε πολυ ο κωδικας και εβγαλα ολους τους ελεγχους τετοιου στυλ για να μην με μπερδευουν... Ευχαριστω παντως οντως ηταν η γραμμη *(names+totalSize)='\0'; ηθελε και ενα -1 εκει γιατι εβγαινα εξω απο τα ορια μνημης που μ εδεινε η realloc! imitheos η ποιοτητα του κωδικα τι προβλημα εχει? :S Επισης για της gets() ετσι μας μαθαν στη σχολη τι αλλο μπορω να κανω? :S Ρίξε μια ματιά όταν ευκαιρήσεις στη συνάρτηση: input_string_eof() σε αυτό το post: http://www.insomnia.gr/topic/432317-%cf%80%cf%81%cf%8c%ce%b2%ce%bb%ce%b7%ce%bc%ce%b1-%ce%bc%ce%b5-%ce%ac%cf%83%ce%ba%ce%b7%cf%83%ce%b7-%cf%83%cf%84%ce%b7%ce%bd-c/page__view__findpost__p__4489887 (είναι νομίζω πολύ παραπλήσια με αυτό που κάνεις κι εσύ )
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα