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

προγραμματισμός με χρήση δεικτών


Miky-Maous

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

Δημοσ.

Ειμαι καπως καινουριος στο προγραμματισμο με δεικτες οποτε η ερωτηση μου μπορει να ειναι λιγο χαζη. Εχω γραψει τον παρακατω κωδικα και υπαρχει προοβλημα στη συναρτηση func2 η οποια θα επρεπε να μου επιστρεφει τους αριθμους απο το α ως το β (αριθμους που επιλέγει ο χρηστης):

 

#include <stdio.h>

#include <stdlib.h>

 

char *func(char *s, int n)

{

char *s2;

int i;

 

s2 = (char *) malloc(n+1);

 

for (i=0;i<n;i++)

s2=s;

s2[n] ='\0';

 

return s2;

}

 

int *func2(int a, int B)

{

int *s2;

int i;

 

s2 = (int *) malloc((b-a+1)*sizeof(int));

 

 

for (i=a;i<=b;i++)

{

s2[i-a]=i;

}

return s2;

}

 

main()

{

char *s = "Hello";

 

printf("%s\n",func(s,2));

 

printf("%d",func2(3,7));

 

 

getchar();

}

 

---------- Το μήνυμα προστέθηκε στις 02:16 ----------

 

Συγγνωμη που τα γραφει ετσι απλα για καποιο λογο βγαζει εναλλαξ κεφαλαια και μικρα μετα απο καθε ισον (=)

 

---------- Το μήνυμα προστέθηκε στις 02:19 ----------

 

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

Δημοσ.

printf("%s\n",func(s,2));

 

printf("%d",func2(3,7));

 

στο πρωτο printf τυπώνεις string χαρακτηρων

 

στο δευτερο σκάει, διότι λές στην printf να τυπώσει έναν ακέραιο αλλα εσυ της δίνεις εναν δείκτη σε πίνακα ακεραίου, αρα στην πραγματικότητα σου τυπώνει τη θέση μνήμης που έκανες malloc (συμπιεσμένη σε απλό int βέβαια).

 

Δεν μπορείς να τυπώσεις με μια εντολή printf εναν ολόκληρο πίνακα και μάλιστα αγνωστου μεγέθους...

 

>
     printf("%d",func2(3,7)[0]); 

 

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

Δημοσ.

στο δευτερο σκάει, διότι λές στην printf να τυπώσει έναν ακέραιο αλλα εσυ της δίνεις εναν δείκτη σε πίνακα ακεραίου, αρα στην πραγματικότητα σου τυπώνει τη θέση μνήμης που έκανες malloc (συμπιεσμένη σε απλό int βέβαια).

 

Δεν μπορείς να τυπώσεις με μια εντολή printf εναν ολόκληρο πίνακα και μάλιστα αγνωστου μεγέθους...

 

Όλοι οι pointers είναι απλοί ακέραιοι 4 byte (σε 32bit λειτουργικά συστήματα). Δεν "συμπιέζεται" πουθενά ο pointer για να γίνει ακέραιος. Είναι unsigned int.

Δημοσ.
Όλοι οι pointers είναι απλοί ακέραιοι 4 byte (σε 32bit λειτουργικά συστήματα). Δεν "συμπιέζεται" πουθενά ο pointer για να γίνει ακέραιος. Είναι unsigned int.

Δεν το εγγυάτε η C αυτό. Αν ένας pointer γίνει cust σε int δεν είναι σίγουρο αν θα χωρέσει. Το ότι ισχύει στα intel/amd pc με τις γνωστές υλοποιήσεις λειτουργικών και compilers δεν είναι λόγος να γενικεύσουμε σε όλο το φάσμα των μικροελενκτών/μικροεπεξεργαστών.

Δημοσ.

Το πως τελικά αναπαρίσταται ένας pointer είναι καθαρά θέμα του συστήματος (hardware / software και compiler) που τρέχει το πρόγραμμα.

 

Η C προσφέρει μέσο της printf("%p"..) (και όχι μόνο) μια αυτόματη αναπαράσταση της διεύθυνσης του pointer αλλά ακόμα και αυτή η αναπαράσταση εξαρτάται από το πιο μοντέλο μνήμης χρησιμοποιεί το πρόγραμμα.

 

Έτσι σε DOS (16bit - cmm) ένα printf("%p..) δίνει 0970:0004 (Segment:Offset) για παράδειγμα ενώ σε Windows ένα 00A532C4 (linear virtual 32bit address).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...