Δυναμική δεσμευση μνήμης με την malloc  Το θέμα επιλύθηκε

...IDE, compilers, κλπ

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

Δυναμική δεσμευση μνήμης με την malloc  Το θέμα επιλύθηκε

Δημοσίευσηαπό kosmos890 » 14 Φεβ 2010, 22:40

Πως συντάσσεται η malloc για την δημιουργία πίνακα ο οποίος έχει δηλωθεί ως int *Α[50]. (Πίνακας 2 διαστάσεων. Η δεύτερη διάσταση έστω 100)
Προσπαθώ με :

for(i=0;i<50;i++)
A[i]=malloc(100*sizeof(int)) αλλά έχω segmentation fault

Δεν θέλω να χρησιμοποίησω πίνακα ο οποίος ορίζεται ως εξείς **Α ή (*A)[50]
Γνώσεις ⇛ Linux: Xαμηλό ┃ Προγραμματισμός: Ναι┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04.1 LTS
Προδιαγραφές ⇛ Pentium 4 2.66Hz│512 MB│GeForce FX 5200 │ ZTE MF636 │ TFT 19"
kosmos890
punkTUX
punkTUX
 
Δημοσιεύσεις: 184
Εγγραφή: 18 Ιαν 2010, 15:13
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Δυναμική δεσμευση μνήμης με την malloc

Δημοσίευσηαπό crafter » 15 Φεβ 2010, 12:05

Αρχικα δν νομιζω να γινεται αλλιως αν δν χρησιμοποιησεις **Α (*Α)[] στη συγκεκριμενη περιπτωση.
Αν παρατηρησεις τον τυπο επιστροφης της malloc ειναι void pointer δηλαδη δν γινεται να τον εξισωσεις με Int η οτιδηποτε αλλο αλλα με pointer (οποιουδηποτε τυπου με casting).


Δευτερον γτ δν θελεις **A η (*A)[] μηπως ειναι καποιος περιορισμος και αν υπαρχει ειναι σιγουρα αυτος;
Με τις παραπανω δηλωσεις (**Α , (*Α)[]) γινεται σιγουρα.Αν εχεις κανει πχ Int A[50]; ε προφανως θα δωσει segmentation fault αφου πας να κανεις δεσμευση σε ενα Int κατι το οποιο δν γινεται.
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Άβαταρ μέλους
crafter
babeTUX
babeTUX
 
Δημοσιεύσεις: 14
Εγγραφή: 27 Ιουν 2009, 21:52
Εκτύπωση

Re: Δυναμική δεσμευση μνήμης με την malloc

Δημοσίευσηαπό ant_0611 » 15 Φεβ 2010, 12:12

Εμένα πάντως το παρακάτω κομμάτι μου δουλέυει... για τσέκαρε τι έχεις κανει λάθος;;;

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=0;
int *A[50];
printf("Now I'll allocate memory!!!\n");
for(i=0;i<50;i++)
{
A[i]=malloc(100*sizeof(int));
}

printf("Now I'll free memory\n");

for(i=0;i<50;i++)
{
free(A[i]);
}


}


@crafter
Συνήθως δεν χρείαζεσαι το casting. Με την έννοια οτι σε μικρό πρόγραμμα δεν μπερδεύεις αγγούρια με πατάτες. Σε εμένα για παράδειγμα στο παραπανω κομματι δεν μου έβγαλε ουτε warning. Αν όμως, έχεις struct ή γενικά πολύπλοκές δομές και θές να ξέρεις τι σου γίνεται σε όλο το πρόγραμμα ( συνηθως αυτο συμβαινει σε μεγάλα προγράμματα), τοτε χρησιμοποιείς casting , και αποφέυγεις και τα warnings όπου υπάρχουν. Στο παραπάνω κομματι κώδικα, αν έβαζα casting θα ήταν αυτό :
Κώδικας: Επιλογή όλων

...
A[i]=(int*)malloc(100*sizeof(int));
...
Γνώσεις ⇛ 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: Δυναμική δεσμευση μνήμης με την malloc

Δημοσίευσηαπό kosmos890 » 15 Φεβ 2010, 20:12

Φίλε crafter ευxαριστώ για το ενδιαφέρον. Ο κώδικας που γράφεις δουλεύει και θα ψάξω προς την κατεύθυνση που προτείνεις.
Ωστόσο διαφωνώ στo εξής :
Εφόσον δηλώνεις int *A[50] τότε έχεις πίνακα δεικτών άρα πιστεύω ότι η malloc γράφεται A[i]=malloc(100*sizeof(int*)), κάθε στοιχείο Α[i] του πίνακα Α είναι δείκτης - στο κώδικα σου έχεις sizeof(int), αυτο θα το έγραφα γιά δήλωση (*Α)[50].
Επίσης θέλω να αντιγράψω τα στοιχεία του πίνακα σε text file με την fopen,fprintf,fclose. Έχω την εντύπωση πως για μεγάλο πλήθος δεδομένων και τους δείκτες
των αρχείων ( FILE *f ;... f=fopen("data.txt."w";... ) πρέπει να είσαι ακριβής στο casting που κάνεις και τα λάθη δεν συγχωρουνται.
Τα πράγματα μπερδεύουν ακόμη περισσότερο όταν προσπαθώ να περάσω τον δυναμικό πίνακα σε συνάρτηση (ποιό είναι το πρότυπο της συνάρτησης?).
Κάποιο πρόγραμμα για debbuging θα βοηθούσε να καταλάβω τι συμβαίνει ? Το gdb μου φάνηκε δύσχρηστο.
Αν έχεις κάποιες απαντήσεις στα ερωτήματα μου θέλω πολύ να τις δώ. Κάποιο link με πληροφορίες είναι επίσης ευπρόσδεκτο.
Γνώσεις ⇛ Linux: Xαμηλό ┃ Προγραμματισμός: Ναι┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04.1 LTS
Προδιαγραφές ⇛ Pentium 4 2.66Hz│512 MB│GeForce FX 5200 │ ZTE MF636 │ TFT 19"
kosmos890
punkTUX
punkTUX
 
Δημοσιεύσεις: 184
Εγγραφή: 18 Ιαν 2010, 15:13
Τοποθεσία: Λάρισα
Εκτύπωση

Re: Δυναμική δεσμευση μνήμης με την malloc

Δημοσίευσηαπό crafter » 16 Φεβ 2010, 12:21

Αρχικα αν δηλωσεις int *Α[50] τοτε θελειςγια καθε Α[i]=(int *)malloc(n*sizeof(int));(οπου n ειναι το μεγεθος που θες να εχει καθε υποπινακας) στη malloc διοτι δεσμευεις χωρο για καθε int *. sizeof(int *) θα ηταν στην περιπτωση που δηλωσεις int **A οποτε A=(int **)malloc(n*sizeof(int *)); οπου εδω ουσιαστικα δηλωνεις τον αριθμο υποπινακων που θελεις να εχει ο δισδιαστατος πινκας στη συγκεκριμενη περιπτωση.Oποτε στη συνεχεια αν θελεις για καθε Α[i] = malloc ....κτλ.

Τωρα αν θελεις να περασεις ενα δυναμικο πινακα σε μια συναρτηση:
void f(int *a);/*το void δν ειναι φυσικα απαραιτητο μπορεις να εχεις οποιοδηποτε τυπο επιστροφης.*/ (σε περιπτωση που εχεις δηλωσει και δεσμευσει *Α)
void f(int **a); (σε περιπτωση που εχεις δηλωσει και δεσμευσει **Α)
void f(int *a[]); (σε περιπτωση που εχεις δηλωσει και δεσμευσει *Α[])
Για πολυδιαστατους πινακες δουλευει αναλογα.

Τελος αν θελεις να περασεις ενα pointer και να τον δεσμευσεις στη συναρτηση:
Στην πιο απλη περιπτωση δλδ αν εχεις δηλωσει int *A;
void f(int **A){
*(A[i])=(int *)malloc(12*sizeof(int));
}
Και στη main προφανως του περνας τη δ/νση δλδ f(&A);
Αυτα.
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Άβαταρ μέλους
crafter
babeTUX
babeTUX
 
Δημοσιεύσεις: 14
Εγγραφή: 27 Ιουν 2009, 21:52
Εκτύπωση

Re: Δυναμική δεσμευση μνήμης με την malloc

Δημοσίευσηαπό kosmos890 » 18 Φεβ 2010, 00:25

Φίλε crafter σε ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ γιατι με βοηθησες να ξεμπερδέψω τα πράγματα με την malloc. Η εξήγηση σου για την σύνταξη της malloc(sizeof(int*)) ήταν πολύ κατατοπιστική.Επίσης πολύ χρήσιμο μου φάνηκε και το πέρασμα δείκτη σε συνάρτηση. Mε κάλυψες απόλυτα!
Γνώσεις ⇛ Linux: Xαμηλό ┃ Προγραμματισμός: Ναι┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04.1 LTS
Προδιαγραφές ⇛ Pentium 4 2.66Hz│512 MB│GeForce FX 5200 │ ZTE MF636 │ TFT 19"
kosmos890
punkTUX
punkTUX
 
Δημοσιεύσεις: 184
Εγγραφή: 18 Ιαν 2010, 15:13
Τοποθεσία: Λάρισα
Εκτύπωση


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