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

Star_Light έγραψε:...θελω να πω αυτο σιγουρα δεν ειναι υλη που διδασκεται σε αρχαριους εσυ τι λες?

migf1 έγραψε:
......
Αν ελέγξουμε πρώτα το περιεχόμενο του δείκτη ( *src == '\0 ') τότε αν ο src είχε για παράδειγμα περαστεί με τιμή NULL στην συνάρτηση, έστω και κατά λάθος, τότε προκαλούμε segmentation-fault (και άρα κενό ασφαλείας) διότι NULL σημαίνει πως δείχνει στο ΠΟΥΘΕΝΑ (που στην πράξη σημαίνει πως δείχνει σε κάποιο τυχαίο σημείο της μνήμης ... undefined ). Οπότε, γράφοντας εμείς *src == '\0' ρισκάρουμε να μετατραπεί κάποια στιγμή στο run-time του προγράμματος σε *NULL == '\0'... κι εκεί αρχίζουν τα όργανα!
......
int *p;
if (src)
{
free(src);
src=NULL;
}

if ( i == NULL )
printf("End");
if ( i == NULL )
puts("*** error, i does not point to usable data);
else {
while ...
}
...
return 0;

stamatiou έγραψε:Οκ, σωστό είναι εκτός από εκείνο το return που μου ξέφυγεΑλλά τι θα πρέπει να επιστρέψει;

migf1 έγραψε:
Το ...
- Κώδικας: Επιλογή όλων
if ( i == NULL )
printf("End");
πρέπει να γίνει...
- Κώδικας: Επιλογή όλων
if ( i == NULL )
puts("*** error, i does not point to usable data);
else {
while ...
}
...
return 0;
και να βγει έξω από το while.
Επίσης, γιατί ρε σεις επιμένετε να βάζετε άσχετα ονόματα στις μεταβλητές σας; Τα i,j,k τα χρησιμοποιούμε για μετρητές, τα x,y,z για πραγματικούς αριθμούς, τα l,m,n για ακέραιους, τα s,t,u για strings, τα p, ptr για δέικτες, τα pp, pptr για δείκτες σε δείκτες ... ξέρετε πόσο δύσκολο είναι να διαβαστεί από άλλους ο κώδικας που ποστάρετε; Τόσες φορές σας το έχω πει


migf1 έγραψε:(μισό ένα-ένα... διαβάζω τώρα το post σου με τις πολλές ερωτήσεις για να τις απαντήσω
)

Star_Light έγραψε:migf1 έγραψε:
......
Αν ελέγξουμε πρώτα το περιεχόμενο του δείκτη ( *src == '\0 ') τότε αν ο src είχε για παράδειγμα περαστεί με τιμή NULL στην συνάρτηση, έστω και κατά λάθος, τότε προκαλούμε segmentation-fault (και άρα κενό ασφαλείας) διότι NULL σημαίνει πως δείχνει στο ΠΟΥΘΕΝΑ (που στην πράξη σημαίνει πως δείχνει σε κάποιο τυχαίο σημείο της μνήμης ... undefined ). Οπότε, γράφοντας εμείς *src == '\0' ρισκάρουμε να μετατραπεί κάποια στιγμή στο run-time του προγράμματος σε *NULL == '\0'... κι εκεί αρχίζουν τα όργανα!
......
Eρωτήσεις :
1.Κάθε string της μορφής s1[]=""; ειναι κενό? Υπαρκτό μεν κενο δε... υπαρκτό επειδη φέρει τον μηδενικο χαρακτήρα ετσι?
έγραψε:2. Μπορεις να δώσεις ενα παράδειγμα απο ενα ανύπαρκτο string???
char *string = NULL; // έγκυρο αλλά ανύπαρκτο γιατί δεν έχει δείχνει σε υπαρκτά περιεχόμενα, δεν έχει καν περιεχόμενα
char *string; // υπαρκτό αλλά άκυρο, γιατί δείχνει άκυρα περιεχόμενα (περιεχόμενα για τα οποία δεν έχουμε την παραμικρή ιδέα ποια είναι και που βρίσκονται)
char *string = calloc(100, sizeof(char) ); // υπαρκτό κι έγκυρο, με τα περιεχόμενά του να αποτελούνται από 100 μηδενικούς χαρακτήρες
έγραψε:3. Εδω μπερδεύομαι λιγο γιατι ειχαμε πει πως σε απροσδιόριστη περιοχή δείχνουν μονο οι άκυροι δείκτες ενω ενας δείκτης ο οποίος δειχνει σε NULL δεν εχει μεν περιεχομενα αλλα ειναι έγκυρος.
έγραψε:4. Αν τα ορίσματα ήταν απλοί πίνακες (ωστε να εξασφαλίσουμε οτι καταρχην δεν θα μας άφηνε να δωσουμε NULL ουτε και κατα λαθος και επισης πως η ομαλή δέσμευση γίνεται αυτόματα) τοτε θα υπήρχε και διαφορά οταν θα τα βάζαμε σαν ορίσματα στην συνάρτηση??? θελω να πω δεν θα τα περνουσαμε ως δείκτες ετσι... αλλα παιζει να ειναι και περιττη αυτη η ερωτηση μιας και το λες και ο ιδιος οτι δεν θα τα διαχειριστουμε ως δεικτες.
έγραψε:
5. Όταν δηλώνεις εναν δεικτη απλα πχ
- Κώδικας: Επιλογή όλων
int *p;
περα απο το οτι δεν ειναι αρχικοποιημενος... δεν δεσμεύεται μνήμη για αυτον? Πρεπει αναγκαστικά να δωσεις calloc για να γινει έγκυρη αυτη η μνήμη? ΔΗλαδη ας πουμε αν ορισω εγω εναν δεικτη ουσιαστικα θα έχει απλα το προκαθορισμενο μέγεθος που είπαμε ειναι ιδιο για ολα τα data types χωρις αυτο να σημαινει πχ οτι τον έχω δεσμεύσει ωστε να μπορει να δείχνει για 10 θέσεις ας πουμε αν εγω πιο μετα σε ενα while τον αυξάνω με αριθμητικη δεικτων ε?
έγραψε:6. ΣΤο παρακατω απόσπασμα κώδικα
- Κώδικας: Επιλογή όλων
if (src)
{
free(src);
src=NULL;
}
Το if(src) ειναι ισοδυναμο με το if(src!==NULL)
ενω το *src!=0 θα ίσχυες αν το string δεν ηταν κενό ?

