migf1 Δημοσ. 1 Μαΐου 2013 Δημοσ. 1 Μαΐου 2013 Γι' αυτό. Είναι invalid αν πας να το κάνεις deference (μιας και το object στο οποίο προορίζεται να δείξει δεν έχει δημιουργηθεί ακόμα). Ως διεύθυνση είναι μια χαρά όπως αποδεικνύει και η απροβλημάτιστη λειτουργία του pointer arithmetic πάνω του. Είναι επίσης απόδειξη πως ο compiler έχει γνώση για το object στο οποίο προορίζεται να δείξει ο δείκτης, για αυτό και η αριθμητική έχει ως σημείο αναφοράς το μέγεθος αυτού του object (την αριθμητική δεν την ενδιαφέρει αν το object είναι δημιουργημένο ή όχι, για αυτό και τα C pointers είναι flexible συγκριτικά με τα references άλλων γλωσσών... έχω δώσει link παραπάνω). Συγγνώμη αλλά κάνεις πολύ μεγάλο λάθος και μάλιστα για πολλούς λόγους. Πρώτον και προφανέστερο, 6.5.6 (pointer addition): Επομένως ο pointer στη main αντιμετωπίζεται σαν pointer στο πρώτο στοιχείο ενός πίνακα από τέτοιους pointers μήκους 1. Εφόσον το +10 που δίνω είναι μεγαλύτερο από +1 νομίζω τα σχόλια περιττεύουν. UB. Δεύτερον, ακόμα κι αν αυτό δεν ήταν UB και πάλι δε μπορείς σε καμία περίπτωση να ξέρεις αν είναι valid pointer ή όχι (6.5.3.3): Προφανές. Δεν ξέρεις καθόλου αν είναι properly aligned. Συνοψίζοντας δεν ξέρω τι λέει ο King αλλά δε με πολυαπασχολεί κιόλας because the standard. Αυτό που κάνει είναι να δίνει παραδείγματα του πότε έχεις invalid pointer και πώς να το αποφύγεις. Δεν "εξηγεί" τι "θεωρείται" invalid pointer γιατί για μένα εξηγώ και ιδιαίτερα τι θεωρείται = δίνω σαφή ορισμό (και παραδείγματα καλοδεχούμενα βέβαια). Αν δε μπορείς να πεις "an undefined pointer is a pointer that X Y Z" δεν έχεις εξηγήσει τίποτα (πάντα με το δική μου αντίληψη της λέξης). Φυσικά και όχι. Θεωρώ ότι χρησιμοποιείς την έκφραση "pointer to object" λανθασμένα γιατί οι invalid pointers δεν είναι pointers to object. Και το undefined behavior εξορισμού επίσης δε μπορείς να λες ότι παράγει pointer to object. Θα σου πρότεινα να σε ενδιαφέρει το τι λέει ο King (αν δλδ λέει αυτό που έγραψα), καθώς επίσης και το να διαβάζεις τις πηγές που επικαλείσαι πριν με βγάλεις λάθος (δανείστηκα την έκφραση από προηγούμενο δικό σου ποστ) δλδ στην προκειμένη περίπτωση το πρότυπο. Οι δείκτες στην C έχουν 3 τύπους: pointers το object types (για data, για αυτούς δηλαδή που μιλάμε σε αυτό το νήμα... το είχα ξανακάνει bold το συγκεκριμένο σε προηγούμενο ποστ, αλλά από ότι καταλαβαίνω από την συνέχεια της συζήτησης δεν κατάλαβες το γιατί), pointers to functions (στους οποίους ΔΕΝ μπορείς να κάνεις αριθμητική δεικτών) και pointer το incomplete object types (δηλαδή το void *). Εσύ λοιπόν έδωσες ένα παράδειγμα που όχι μόνο έμπλεκες pointer to object με pointer to function αλλά έκανες κι αριθμητική δεικτών πάνω σε pointer to function (χωρίς καν cast, το οποίο cast σε αυτή την περίπτωση είναι compiler dependent αλλά στους περισσότερους δουλεύει). Σου εξήγησα πως πρόκειται για incompatible pointer types και όχι για invalid value, και η απάντησή σου είναι πως κάνω πολύ μεγάλο λάθος και πως δεν σε απασχολεί ο King επικαλούμενος το στάνταρ, για το οποίο όμως στάνταρ είναι προφανές δεν διαβάζεις επαρκώς. Επίσης επιμένεις πως εγώ λέω ότι το ub παράγει pointer του object, αλλά αδυνατώ να βρω λόγια ή κώδικά μου που να παράγει ub. Αυτή είναι η τελευταία φορά που σου απαντάω για το συγκεκριμένο θέμα, κλείνοντας με το πως γράφεται σωστά σε C ο κώδικας του τελευταίου σου παραδείγματος, με την προϋπόθεση πως γνωρίζεις πως δεν είναι portable across compilers... int *m = (int *)&main + 10; printf("%p\n", m); Αν δεν μπορείς να εντοπίσεις τις διαφορές μεταξύ αυτού και του δικού σου, θα το αφήσω σε κάποιον άλλον να προσπαθήσει να στο εξηγήσει, διότι εγώ δεν έχω να πω κάτι παραπάνω από όσα έχω ήδη πει στο νήμα (κι έχω αρχίσει να επαναλαμβάνομαι αχρείαστα).
sonyxp Δημοσ. 5 Μαΐου 2013 Μέλος Δημοσ. 5 Μαΐου 2013 Ξεχασα να αναφερω οτι προσεξα οτι το προγραμμα δεσμευει διευθυνσεις μνημης στη σειρα οπως και με τον πινακα, στην δυναμικη δεσμευση ομως οπως γνωριζουμε δεν ισχυει αυτο που ισχυει με τον πινακα, γιατι ομως τα παιρνει στη σειρα?
nilosgr Δημοσ. 5 Μαΐου 2013 Δημοσ. 5 Μαΐου 2013 Ξεχασα να αναφερω οτι προσεξα οτι το προγραμμα δεσμευει διευθυνσεις μνημης στη σειρα οπως και με τον πινακα, στην δυναμικη δεσμευση ομως οπως γνωριζουμε δεν ισχυει αυτο που ισχυει με τον πινακα, γιατι ομως τα παιρνει στη σειρα?Εεε ναι, αφού η stack είναι συνεχόμενη (τουλάχιστον έτσι την *βλέπει* η εφαρμογή). Αν δοκιμάσεις ανακατεμένα malloc - free σε διάφορα μεγέθη, τότε νομίζω δεν θα είναι σε φθίνουσα σειρά οι διευθύνσεις που επιστρέφει η malloc. ;-)
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα