parsifal Δημοσ. 15 Ιουνίου 2010 Δημοσ. 15 Ιουνίου 2010 Λοιπόν, έριξα μια ματιά στο πιο πρόσφατο revision του C99 standard. Αναφέρει τα παρακάτω για τα string literals σχετικά με θέματα που συζητήθηκαν στο παρόν thread: It is unspecified whether these arrays are distinct provided their elements have the appropriate values. [b']If the program attempts to modify such an array, the behavior is undefined.[/b] String literals' date=' and compound literals with const-qualified types, need not designate distinct objects. [86] [86] This allows implementations to share storage for string literals and constant compound literals with the same or overlapping representations. EXAMPLE 5 The following three expressions have different meanings:"/tmp/fileXXXXXX" (char []){"/tmp/fileXXXXXX"} (const char []){"/tmp/fileXXXXXX"} The first always has static storage duration and has type array of char' date=' but [b']need not be modifiable[/b]; the last two have automatic storage duration when they occur within the body of a function, and the first of these two is modifiable. EXAMPLE 6 Like string literals, const-qualified compound literals can be placed into read-only memory and can even be shared. On the other hand' date=' the declarationchar *p = "abc"; defines p with type ‘‘pointer to char’’ and initializes it to point to an object with type ‘‘array of char’’ with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to modify the contents of the array, [b']the behavior is undefined[/b]. J.2 Undefined behaviorThe behavior is undefined in the following circumstances: ... — The program attempts to modify a string literal (6.4.5). Το standard δεν εγγυάται ούτε ότι τα string literals είναι modifiable ούτε το αντίθετο. Άρα, η ασφαλέστερη και πιο portable επιλογή είναι να θεωρούνται unmodifiable.
Neal Δημοσ. 15 Ιουνίου 2010 Δημοσ. 15 Ιουνίου 2010 Ευχαριστώ για τις παραθέσεις. Το θέμα είναι ότι αυτός δε χρησιμοποιεί gcc αλλά borland builder του 90' version και δε φαίνεται να αναγνωρίζει και το λάθος του. Περιμένω την επόμενη απάντηση του πάντως.
Neal Δημοσ. 16 Ιουνίου 2010 Δημοσ. 16 Ιουνίου 2010 Καλησπέρα' date=' η έκφραση "ΑΒCDE" επιστρέφει const char* σύμφωνα με το πρότυπο της C. Άρα η διεύθυνση που παίρνει η p δεν είναι εγγράψιμη αλλά μόνο μπορούμε να διαβάσουμε. Με την εντολή >p[n] = 'X' προσπαθούμε να γράψουμε σε μια μη-εγγράψιμη περιοχή και το πρόγραμμα χτυπάει. Έστω, όμως, ότι δε χτυπάει και ότι όλα τρέχουν καλά. Η εντολή p="ABCDE" σε κάθε loop θα περιέχει άλλη διεύθυνση μνήμης ή την ίδια; Στην ουσία σε κάθε loop το *p θα είναι ΑΒCDE ή αναλόγως αν έχουμε βάλει Χ θα μπορεί να είναι AXCDE, AXXDE κλπ. Δηλαδή, τι θα εκτυπώσει εν τέλει το πρόγραμμα; [/quote'] Η δέσμευση της αντίστοιχης μνήμης για το “ABCDE” γίνεται όταν μεταφράζεται το πρόγραμμα άρα μένει η ίδια σε όλη την εκτέλεση του προγράμματος; Εντάξει, τώρα τι του λες;
imitheos Δημοσ. 16 Ιουνίου 2010 Δημοσ. 16 Ιουνίου 2010 ; Εντάξει, τώρα τι του λες; Αν είναι όπως τον περιγράφεις, τότε ό,τι και να του πεις θα πέσει στο κενό. Εσύ προγραμμάτισε σωστά και άστον να λέει. Και μόνο που βλέπεις void main στο πρόγραμμά του αρκεί για να κρίνεις.
V.I.Smirnov Δημοσ. 16 Ιουνίου 2010 Δημοσ. 16 Ιουνίου 2010 Τα παιδιά εντόπισαν ότι η άσκηση δόθηκε με λάθος και επομένως το να ρωτάς τον καθηγητή αποσκοπεί μόνον στο να το δει και να το παραδεχτεί και αυτός. Είτε διαβάζει επιπόλαια αυτά που του στέλνεις και δεν αντιλαμβάνεται την ουσία του ερωτήματος, είτε υπεκφεύγει. Λοιπόν κατ' εμέ δεν το χειρίστηκες σωστά. Έπρεπε να του πεις ξεκάθαρα ότι θεωρείς την εκφώνηση λανθασμένη γι' αυτόν και γι' αυτόν τον λόγο. Έυγενικά βέβαια, χωρίς να τον προσβάλλεις. Έτσι δεν θα υπήρχε περιθώριο παρερμηνείας και θα αναγκαζόταν να απαντήσει επί της ουσίας.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.