Δημοσιεύτηκε: 11 Απρ 2012, 16:38
από migf1
Ilias95 έγραψε:Γεια χαρά,

Καλησπέρα,

έγραψε:Τελείωσα το κεφάλαιο 17 και έχω κάποιες απορίες.
Τις παραθέτω.


1. Το παρακάτω είναι το prototype της malloc:
Κώδικας: Επιλογή όλων
void *malloc(size_t size);

Τι ακριβώς καταλαβαίνουμε από αυτό για τον τύπο που επιστρέφει η malloc;
Είναι ένας pointer σε τι; Είναι μήπως ένας pointer που μπορεί να δείχνει σε οποιονδήποτε τύπο;

Ακριβώς! Είναι ο στάνταρ τρόπος για generic/abstract programming στη C. Ουσιαστικά δηλώνεις abstractly τα data σου ως δείκτες σου void, και όταν φτιάχνεις συναρτήσεις που θα τα χρησιμοποιήσουν, τα κάνεις cast στον κανονικό τους τύπο.

έγραψε:2. Είναι η παρακάτω σωστή λύση για την 1η άσκηση της σελίδας 453;
Μορφοποιημένος Κώδικας: Επιλογή όλων
void *my_malloc(size_t size) 
{
void *s = malloc(size);
if (!s) {
puts("error: out of memory");
exit(EXIT_FAILURE);
}
return s;
}

Σε real-life εφαρμογές συνηθίζεται να γίνεται χρήση παρόμοιων συναρτήσεων;

Συνήθως δεν διακόπτουμε το πρόγραμμα άμεσα μέσα στις συναρτήσεις. Συνήθως τις βάζουμε να επιστρέφουν κάποια τιμή αποτυχίας και διαχειριζόμαστε όλα τα πιθανά σφάλματα σε πιο υψηλό επίπεδο, όπου έχουμε πιο εποπτικό έλεγχο στο πρόγραμμα και μπορούμε π.χ. να κάνουμε cleanup πριν τερματίσουμε.

Για παράδειγμα, αν είχες 2 τέτοιες συναρτήσεις που έκαναν malloc 2 διαφορετικά πράγματα (π.χ. η μια έναν πίνακα από int και η άλλη έναν πίνακα από float) τότε αν τις υλοποιήσεις και τις 2 όπως παραπάνω, και αποτύχει μόνο η 2η, τότε τερματίζεις το πρόγραμμα χωρίς να κάνεις cleanup τη μνήμη που έχει δεσμεύσει η 1η (potential memory leak).

έγραψε:
3. Το παρακάτω sample μου δίνει έξοδο 14:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *a;

a = malloc(3 * sizeof(int));
a[0] = 4;
a[1] = 3;
a[7] = 14;
printf("%d\n", a[7]);

return 0;
}

Πως γίνεται να δουλεύει σωστά; Αφού υποτίθεται ότι η a έχει δεσμευμένο χώρο για 3 στοιχεία.
Δουλεύει κατά τύχη ή συμβαίνει κάτι άλλο;

Κατά τύχη δουλεύει. Αν συνέβαιναν κι άλλα πράγματα στη συνέχεια του προγράμματος (και δεν είναι δλδ μόνο αυτή η συνάρτηση) πιθανότατα θα σου πέταγε seg-fault.
Αυτό το 14 που βάζεις σε εκτός ορίων μνήμης αντικαθιστά ότι υπήρχε πριν σε εκείνο το σημείο της μνήμης (το οποίο μπορεί να χτυπήσει άμεσα, αργότερα ή και ποτέ :lol: ... σίγουρα πάντως υπάρχει πρόβλημα).