Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Παιδια εχω το εξης προβλημα εφτιαξα ενα προγραμμα που να παιρνει συμβολοσειρες και

να τις αποθηκευει δυναμικα σε μια συμβολοσειρα με τον χαρακτηρα '/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...

Δημοσ.

Ο κώδικας είναι γραμμένος πολύ συμπυκνωμένα με αποτέλεσμα να μην είναι καθόλου ελκυστικός για να ασχοληθεί να τον διαβάσει κάποιος (ή τουλάχιστον εγώ).

 

Αν είσαι σε Windows, το system("pause") δεν δημιουργεί κανένα πρόβλημα! Προφανώς κάπου αλλού σκάει ο κώδικάς σου, κι απλά εμφανίζεται εκεί.

 

Μερικές γενικές μόνο παρατηρήσεις:

 

α) όταν κάνεις realloc() να ελέγχεις πρώτα αν απέτυχε με κάποιον προσωρινό δείκτη, κι αν αυτός ΔΕΝ γίνει NULL, τότε και μόνο τότε να αναθέτεις τον κανονικό σου δείκτη στον πετυχημένο προσωρινό. Αλλιώς αν αποτύχει η realloc() πάνω στον κανονικό σου δείκτη, τον κάνει NULL κι οποιαδήποτε μετέπειτα αναφορά σε αυτόν δίνει seg-fault.

 

β) το realloc() δεν εγγυάται πως θα σου επιστρέψει τη νέα μνήμη ως συνέχεια της παλιάς, μπορεί κάλλιστα να σου επιστρέψει μια τελείως νέα διεύθυνση. Οπότε αν τυχόν χρησιμοποιείς κάνα δείκτη-μετρητή πριν την realloc, τότε θα πρέπει να τον ενημερώνεις μετά την κλήση της realloc (ώστε να πάει κι αυτός στην νέα περιοχή).

 

γ) χρησιμοποίησε τον debugger του compiler σου!

Δημοσ.

>
 *(names+totalSize)='\0';

 

Συμφωνώ με τα σχόλια του migf1 και παραβλέπω την ποιότητα του κώδικα και το γεγονός ότι χρησιμοποιεί gets.

 

Όσον αφορά το crash, μια πιθανή αιτία είναι η παραπάνω γραμμή.

Δημοσ.

Δεν εβαλα ελεγχους για NULL δεικτες τους σε αυτο εχεις δικιο migf1 απλα με

παιδεψε πολυ ο κωδικας και εβγαλα ολους τους ελεγχους τετοιου στυλ για να μην με μπερδευουν...

 

Ευχαριστω παντως οντως ηταν η γραμμη *(names+totalSize)='\0'; ηθελε και ενα -1 εκει

γιατι εβγαινα εξω απο τα ορια μνημης που μ εδεινε η realloc!

 

imitheos η ποιοτητα του κωδικα τι προβλημα εχει? :S

Επισης για της gets() ετσι μας μαθαν στη σχολη τι αλλο μπορω να κανω? :S

Δημοσ.

Δεν εβαλα ελεγχους για 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 (είναι νομίζω πολύ παραπλήσια με αυτό που κάνεις κι εσύ ;) )

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...