DAVID J. MALAN: Έτσι αποδεικνύεται ότι αντιγράφοντας μια σειρά δεν είναι τόσο απλή όσο η αντιγραφή μια πρωτόγονη, σαν int ή float. Μετά από όλα, κάτω από το καπό μια συμβολοσειρά είναι μια ακολουθία χαρακτήρων. Έτσι, αντιγράφοντας μια σειρά, ως εκ τούτου, πρέπει να συνεπάγεται ότι η αντιγραφή όλης της σειράς των χαρακτήρων. Ας στρέψουμε την προσοχή μας πίσω σε αυτό τελευταίας εφαρμογής και rip έξω αυτό γραμμή, string t ισούται με s, η οποία προφανώς δεν ήταν επαρκής. Ας το αντικαταστήσει με μια γραμμή που Φαίνεται, αντίθετα, σαν αυτό. String t παίρνει malloc μήκους σειρά s συν 1 φορές το μέγεθος ενός χαρακτήρα. Τώρα υπάρχει απόσπασμα λίγο θα σε σε αυτή τη γραμμή κώδικα. Πρώτον, malloc, μικρή για τη μνήμη κατανομής, και το λειτουργία κάνει ακριβώς αυτό. Δεδομένου ακέραιος, επιστρέφει για να σας το διεύθυνση του ένα μεγάλο κομμάτι της μνήμης ότι πολλά bytes. Εν τω μεταξύ, το μήκος των χορδών s συν 1 έχει ως στόχο να δείξουμε ότι θέλουμε ως πολλά bytes ως s κατέχει ήδη, συμπεριλαμβανομένων των μηδενικών τερματισμού της, η backslash 0 στο τέλος μιας συμβολοσειράς. Εν τω μεταξύ, δεν θέλω οπωσδήποτε να θυμάστε πόσο μεγάλο θα είναι το char είναι, ακόμη και αν και στα περισσότερα συστήματα είναι απλά 1 byte, οπότε θα καλέσω το μέγεθος του χαρακτήρα και να καταλάβω πόσο μεγάλο δυναμικά ένα άτομο χαρακτήρας είναι. Μόλις πολλαπλασιάζονται μαζί, να πάρω πίσω το συνολικός αριθμός των bytes που χρειάζομαι. Αλλά τι θα γινόταν αν malloc αποτύχει να επιστρέφει τη μνήμη χρειαζόμαστε; Θα ελέγχετε καλύτερα γι 'αυτό ως ακολούθως. Αν t ισούται με μηδέν, τότε είμαι πρώτα θα στην ελεύθερη s, η μνήμη επιστρέφει με get string, και μετά θα πάω να επιστροφή 1, να δηλώσει σφάλμα. Αλλά αν όλα είναι καλά, θα πάω να προχωρήσει να χρησιμοποιήσετε ένα βρόχο και τέσσερις επαναλήψεις ως ακολούθως. Για int i πάρει 0, n ισούται το μήκος της συμβολοσειράς s. Πάω να το κάνετε αυτό, εφόσον i είναι μικρότερη ή ίση προς n έτσι ώστε να μπορώ επαναλήψεις μέσα από και συμπεριλαμβανομένης της null χαρακτήρα που καταλήγει σε s. Και σε κάθε επανάληψη, είμαι πρόκειται να αυξήσετε i. Εν τω μεταξύ, στο εσωτερικό αυτού του βρόχου, αντιγραφή s i-ου χαρακτήρα σε t i-th θέση, αρκεί να κάνουμε t βραχίονα i παίρνει s βραχίονα i. Είχα καλύτερα να προσθέσετε ένα επιπλέον γραμμή στον κώδικά μου. Ειδικότερα, επειδή είμαι χρησιμοποιώντας τώρα malloc, ζητώντας τη μνήμη, αυτό είναι μου ευθύνη να ελευθερώσετε ότι η μνήμη όταν είμαι γίνει με αυτό, ακριβώς όπως εμείς θα πρέπει να απελευθερώνοντας τη μνήμη που είναι που μας δόθηκε από πάρει σειρά. Έτσι, στο τέλος αυτού του προγράμματος, είμαι πρόκειται να προσθέσει μια επιπλέον γραμμή να ελευθερώσει t πριν από την επιστροφή 0 για να δείξει την επιτυχία. Ας σώσει τώρα, την κατάρτιση, και εκτελέσετε αυτό το νέο πρόγραμμα. Κάντε ένα αντίγραφο 1 dot κάθετο αντίγραφο 1. Και θα πω κάτι σαν γεια σε όλα τα πεζά. Και ευτυχώς, αυτή τη φορά μου πρωτότυπο παραμένει αμετάβλητη. γεια σε όλα τα πεζά. Αλλά το αντίγραφο είναι, πράγματι, κεφαλαιοποιούνται.