Απορία για sizeof() και δείκτες - C  Το θέμα επιλύθηκε

...IDE, compilers, κλπ

Συντονιστής: konnn

Απορία για sizeof() και δείκτες - C

Δημοσίευσηαπό Luke » 18 Φεβ 2010, 18:42

Τυπώνοντας τι μου δίνουν τα παρακάτω statements
Κώδικας: Επιλογή όλων
sizeof(unsigned short)
sizeof(unsigned short*)
έχω το εξής αποτέλεσμα
Κώδικας: Επιλογή όλων
2
4

Μπορείτε να μου εξηγήσετε γιατί υπάρχει αυτή η διαφορά; Γιατί το γεγονός ότι είναι δείκτης το όρισμα στη δεύτερη περίπτωση αλλάζει το αποτέλεσμα;
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

Re: Απορία για sizeof() και δείκτες - C  Το θέμα επιλύθηκε

Δημοσίευσηαπό ant_0611 » 18 Φεβ 2010, 19:49

Η διαφορά ειναι βασική και μεγάλη... Για να δεικτοδοτήσεις μια οποιαδήποτε μεταβλητή σε ένα 32bit σύστημα υπολογιστή χρειάζεσαι 32bit = 4bytes . Το τί τύπου θές να ειναι, ειναι απλα ένας τρόπος να περιορισεις τους τρόπους που θές να διαβάζεται αυτο που δειχνει ο δείκτης σου.
Απο την άλλη, για να αποθήκευσεις εναν short αριθμό σε ενα 32bit σύστημα υπολογιστή, χρειάζεσαι τα μισα bytes απο ότι ενας integer. Ενας integer σε ενα 32bit συστημα χρειάζεται 32bit για να αποθηκευθεί. Οπότε ενας short θέλει 16bit = 2bytes.

Τώρα, το γιατι μια δεικτοδότηση χρειάζεται ντε και καλα 32 bit ή 64 bit για 32/64 bit συστήματα αντίστοιχα, ειναι άλλου παπα ευαγγέλιο. Ειναι ενας τρόπος που χρησιμοποιείται απο τον επεξεργαστή και την cache του επεξεργαστή, ωστε να μειώνει τον μέσο αριθμό προβάσεων στην μνήμη RAM ( μαζί και το αντιστοιχο κοστος) αποθηκευοντας προσωρινα στην cache, αλλα ταυτόχρονα να επιτρέπει και την χρήση εικονικής μνήμης (swap). Αν θές να μάθεις λεπτομέρειες διαβασε για TLB και caches.

Ο ίδιος λόγος ειναι και το γιατί οι 32bit επεξεργαστές, μπορουν να υποστηρίξουν μέχρι 2^32Byte =4GByte, μέγιστη μνήμη RAM ( ή γενικα για κάθε διεργασία του συστήματος.)

Τώρα, στην C.
Εσύ πρεπει να θυμάσαι οτι όταν δηλώνεις εναν δεικτη και μετα κανεις δέσμεση μνήμης 100 ακεραιων και τον κανεις να δειχνει σε αυτη .
Κώδικας: Επιλογή όλων
int* a;
a=(int*)malloc(100*sizeof(int));


Τότε ο δεικτης θα έχει σταθερό μέγεθος , και θα ειναι ουσιαστικά μια μεταβλητή που κρατάει την διευθυνση μνήμης του πρώτου byte της μνήμης που δεσμευσες πριν. Για παράδειγμα, έστω οτι γεμίζεις τον χωρο μνήμης που δεσμευσες παραπάνω,
Κώδικας: Επιλογή όλων

int i=0;
for (i=0l;i<100;i++)
{
a[i]=i;
}


Τότε το παρακάτω
Κώδικας: Επιλογή όλων

printf("a=%d \t *a=%d \n",a,*a);

θα σου τύπωνε
Κώδικας: Επιλογή όλων

a= /*dieythynsi mnimis*/ *a=0;


Σημείωση : τον κώδικα δεν τον έχω δοκιμασει τώρα, αλλα λογικά δεν έχει προβλημα.
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός:Ναι ┃ Αγγλικά: Μέτρια
Laptop:
Spoiler: show
Ubuntu 9.10 σε Fujitsu-Siemens A1667G2
Προδιαγραφές ⇛ Επεξεργαστής : AMD Turion 64 ML-37 │ Μνήμη : 1GB│ Κάρτα Γραφικών : ATI X700 128MB │ Κάρτα Ασύρματη : Broadcom Corporation BCM4318 [AirForce One 54g] 802.11g (rev 02) │ Κάρτα Ήχου : VIA 8237 │ 15.4" Glossy 1280x800

Desktop:
Spoiler: show
Ubuntu 10.04
Προδιαγραφές ⇛ Επεξεργαστής : AMD Αthlon 1800+ │ Μνήμη : 1GB│ Κάρτα Γραφικών : Geforce 4 mx440 64MB │ 17" Glossy 1280x1024
Άβαταρ μέλους
ant_0611
punkTUX
punkTUX
 
Δημοσιεύσεις: 294
Εγγραφή: 11 Απρ 2009, 15:16
Τοποθεσία: Χανιά
Εκτύπωση

Re: Απορία για sizeof() και δείκτες - C

Δημοσίευσηαπό Luke » 18 Φεβ 2010, 20:14

Νομίζω ότι κάλυψες και με το παραπάνω την απορία μου. :thumbup:

Βασικά αυτό που προσπαθώ να φτιάξω είναι ένα απλό client-server πρωτόκολλο και θέλω να ανταλλάσονται σταθερού μεγέθους μηνύματα μεταξύ των 2 άκρων. Έτσι για τα μηνύματα που θέλω να φτιάξω θέλω να δεσμεύσω κάποιες "στάνταρ" θέσεις μνήμης. Π.χ. ένα μήνυμα-πακέτο που θα στέλνει δεδομένα θέλω να δεσμεύει πάντα 2 bytes δεδομένων και αυτό το έκανα όπως παραπάνω αλλά με τη χρήση δεικτών οπότε τελικά δέσμευε 4 bytes αντί για 2 που ήθελα. Θα το προσπαθήσω να δω τι γίνεται αν αφαιρέσω τους δείκτες αλλά για για αρχή σίγουρα θα γίνει μπάχαλο. :D

Αν δε βγάλω άκρη μπορεί να επανέλθω.
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

Re: Απορία για sizeof() και δείκτες - C

Δημοσίευσηαπό ant_0611 » 18 Φεβ 2010, 22:27

Αυτο που θα λαμβάνεις απο την receive() , αυτο θα το έχει σε σταθερο μέγεθος.
Αν δεν θες να εχεις μεγάλα πακετα, στελνε ενα- εναν τον short ή και 5 - 5 μαζεμένους.
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός:Ναι ┃ Αγγλικά: Μέτρια
Laptop:
Spoiler: show
Ubuntu 9.10 σε Fujitsu-Siemens A1667G2
Προδιαγραφές ⇛ Επεξεργαστής : AMD Turion 64 ML-37 │ Μνήμη : 1GB│ Κάρτα Γραφικών : ATI X700 128MB │ Κάρτα Ασύρματη : Broadcom Corporation BCM4318 [AirForce One 54g] 802.11g (rev 02) │ Κάρτα Ήχου : VIA 8237 │ 15.4" Glossy 1280x800

Desktop:
Spoiler: show
Ubuntu 10.04
Προδιαγραφές ⇛ Επεξεργαστής : AMD Αthlon 1800+ │ Μνήμη : 1GB│ Κάρτα Γραφικών : Geforce 4 mx440 64MB │ 17" Glossy 1280x1024
Άβαταρ μέλους
ant_0611
punkTUX
punkTUX
 
Δημοσιεύσεις: 294
Εγγραφή: 11 Απρ 2009, 15:16
Τοποθεσία: Χανιά
Εκτύπωση


Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού