Firetrooper Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 Παιδες θα ηθελα την βοηθεια σας σχετικα με το προβλημα που λεγεται malloc στην C!! θα μπορουσε καποιος να μου δειξει την χρηση της και να μου εξηγησει καπως πως λειτουργει? διαβαζω απο δω διαβαζω απο κει και δεν καταλαβαινω τπτ!!! ευχαριστω εκ των προτερων
teo64x Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 Μπορείς να φτιάξεις έναν πίνακα 10 χαρακτήρων με την πρόταση char str[10]. Αυτό είναι στατική δομή και πολλές φορές δεν εξυπηρετεί. Υπάρχουν τρόποι να χρησιμοποιήσεις μια δυναμική κατανομή μνήμης (οι λόγοι γι' αυτό είναι πολλοί και μπορείς να τους διαβάσεις ίσως στη wikipedia). Για παράδειγμα, για να έχεις αποτέλεσμα αντίστοιχο με το παραπάνω με malloc, θα έκανες char* str = (char*)malloc(10*sizeof(char)). Η sizeof() επιστρέφει το μέγεθος που απαιτείται για ένα στοιχείο του τύπου που δηλώνει το όρισμά της. Πολλαπλασιασμένο επί 10, δίνει το μέγεθος που απαιτείται για αποθήκευση 10 τέτοιων στοιχείων. Η malloc παίρνει αυτή την παράσταση ως όρισμα και κρατάει τόση μνήμη. Το cast (char*) λέει πως αυτή η μνήμη που εξασφάλισε η malloc θα επιστραφεί με τη μορφή char* (γιατί αυτού του τύπου είναι η μεταβλητή στην οποία την αναθέτουμε).
Firetrooper Δημοσ. 5 Σεπτεμβρίου 2009 Μέλος Δημοσ. 5 Σεπτεμβρίου 2009 H malloc οριζεται εκει που οριζονται και οι μεταβλητες? και μετα αν τυχει να χρησιμοποιησουμε μια επαναληψη για εναν πινακα δυναμικα δεσμευμενο στην επαναληψη for (i =0 ,i++ , i< ? ; )τι θα βαλουμε στην θεση του ερωτηματικου?
jtsc21 Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 γτ ? δεν επιτρεπεται να διατυπωνω την οποιαδηποτε απορια εχω πανω στον προγραμματισμο? ή μηπως υπαρχει thread που να ειναι ειδικα γ αποριες πανω στην C και δεν το ειδα? με παρεξηγησες...το δικο μου ποστ ειπα να διαγραφει γιατι ειχα γραψει κατι και μετα ηθελα να το σβησω.δεν ειπα να διαγραφει το θεμα σου
Firetrooper Δημοσ. 5 Σεπτεμβρίου 2009 Μέλος Δημοσ. 5 Σεπτεμβρίου 2009 με παρεξηγησες...το δικο μου ποστ ειπα να διαγραφει γιατι ειχα γραψει κατι και μετα ηθελα να το σβησω.δεν ειπα να διαγραφει το θεμα σου χιλια συγγνωμη τοτε! απλα τρεχω καιρο με αυτην την εντολη και οταν ειδα αυτο τρελαθηκα! πραγματικα συγγνωμη!!!
kagelos Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 Έστω ότι θες να φτιάξεις ένα πρόγραμμα που θα κρατάει αριθμούς μητρώων (πελατών, μαθητών - φαντάσου κάτι). Δεν ξέρεις όμως πόσα ονόματα θα κρατήσεις πριν τρέξει ο χρήστης το πρόγραμμα. Άρα δεν μπορείς να δηλώσεις έναν πίνακα π.χ. int[10] ar_mit; Χρειάζεσαι δυναμική δέσμευση μνήμης. Αυτό κάνει η malloc στην C. Η malloc απλά δεσμεύει x bytes στην μνήμη και σου επιστρέφει έναν δείκτη που δείχνει στην πρώτη θέση στη μνήμη που ξεκίνησε η δέσμευση. Όσο για το τι θα βάλεις στο for δες το εξής παράδειγμα (με τα μητρώα) : >[color="#0000ff"]#include[/color] <stdio.h> [color="#0000ff"]#include[/color] <stdlib.h> [color="#8000ff"]int[/color] main([color="#0000ff"][b]void[/b][/color]) { [color="#8000ff"]int[/color] i = [color="#ff8000"]0[/color]; [color="#8000ff"]int[/color] numMitroa = [color="#ff8000"]0[/color]; [color="#8000ff"]int[/color] *mitroa = NULL; printf([color="#a31515"]"Dose arithmo mitroon : "[/color]); scanf([color="#a31515"]"%d"[/color], &numMitroa); mitroa = ([color="#8000ff"]int[/color] *)malloc(numMitroa * [color="#0000ff"][b]sizeof[/b][/color]([color="#8000ff"]int[/color])); [color="#0000ff"][b]for[/b][/color] (i=[color="#ff8000"]0[/color]; i<numMitroa; i++) { printf([color="#a31515"]"Dose mitroo %d : "[/color], (i+[color="#ff8000"]1[/color])); scanf([color="#a31515"]"%d"[/color], &mitroa[i]); } [color="#0000ff"][b]for[/b][/color] (i=[color="#ff8000"]0[/color]; i<numMitroa; i++) { printf([color="#a31515"]"Mitroo %d : %d\n"[/color], (i+[color="#ff8000"]1[/color]), mitroa[i]); } [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } Η γραμμή : mitroa = (int *)malloc(numMitroa * sizeof(int)); δεσμεύει numMitroa * sizeof(int) byte στην μνήμη. Αν δηλαδή δώσαμε 10 και το μέγεθος ενός ακέραιου είναι 4, τότε θα δεσμεύσει 40 bytes. Θα ήταν δηλαδή απόλυτα έγκυρο να γράφαμε malloc(40) Μόνο που αυτό δεν λαμβάνει υπ' όψη του ούτε τι έδωσε ο χρήστης πριν, ούτε το γεγονός ότι το μέγεθος του ακεραίου αλλάζει από αρχιτεκτονική σε αρχιτεκτονική.
Firetrooper Δημοσ. 5 Σεπτεμβρίου 2009 Μέλος Δημοσ. 5 Σεπτεμβρίου 2009 με μπερδεψε λιγο το numMitroa ... γτ 0 και ποια η χρηση του?τι υποδυκνειει με αλλα λογια
Evgenios1 Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 Η malloc ( memory allocation ) επιστρεφει ( εικονικες )διευθυνσεις της μνημης, ως παραμετρο περνει το μεγεθος(σε byte) του μπλοκ της μνημης που θελεις. Πχ. Εχεις 5 αρηθμους (int) (123,243,999,0,1),και θελεις να τους "ανεβασεις" στη μνημη με τη malloc θα φτιαξεις ενα pointer int *ptrInts=NULL; μετα θα καλεσεις τη malloc με παραμετρο 5 (το πλυθος των δεδομενων) * 4 (το μεγεθος του δεδομενου σε byte) ptrInts =(int*) malloc( 5 * 4 ); Αν πανε ολα καλα, θα σου επιστρεψει τις διευθυνσεις σε ( *void ) *νομιζω οτι πρεπει να τα κανεις καστ σε int* σε αυτη τη περιπτωση Ετσι θα εχεις προσβαση στις θεσεις 0003,0004,0005,0006,0007 της μνημης *οι διευθυνσεις ειναι τελειος θεωρητικες *οι διευθυνσεις που σου επιστρεφει η malloc ειναι εικονικες > ptrInts[0]=123; ptrInts[1]=243; ptrInts[2]=999; ptrInts[3]=0; ptrInts[4]=1; *Αν κανω κατι λαθος θα με διορθωσουν
kagelos Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 με μπερδεψε λιγο το numMitroa ... γτ 0 και ποια η χρηση του?τι υποδυκνειει με αλλα λογια Διάβασε τον κώδικα ... scanf -> γνωρίζεις την χρήση της? Η τιμή 0 είναι απλά αρχικοποίηση. Η λογική του προγράμματος είναι : Μας δίνει ο χρήστης το πλήθος των μητρώων που θέλει να εισάγει (αυτό το διαβάζουμε με την scanf και το αποθηκεύουμε στην numMitroa). Πλέον η numMitroa δεν έχει τιμή μηδέν αλλά ότι έγραψε ο χρήστης. Στην συνέχεια ζητάμε από τον χρήστη να μας δώσει τους αριθμούς των μητρώων ένα-ένα (πρώτο for) και στη συνέχεια απλά τους τυπώνουμε (δεύτερο for) Υ.Γ. το έτρεξες το πρόγραμμα; Debug γνωρίζεις τι είναι; Υ.Γ. 2 Η malloc δεν είναι εντολή, αλλά συνάρτηση.
Evgenios1 Δημοσ. 5 Σεπτεμβρίου 2009 Δημοσ. 5 Σεπτεμβρίου 2009 Βασηκα ψαξου για memory, memory stack, memory heap, memory overflow, memory underflow, menory allocation, memory reallocation, memory clean, win32 memory allocation.... etc... + memory address, memory virtual address και αλλα πολλα
Firetrooper Δημοσ. 6 Σεπτεμβρίου 2009 Μέλος Δημοσ. 6 Σεπτεμβρίου 2009 Διάβασε τον κώδικα ...scanf -> γνωρίζεις την χρήση της? Η τιμή 0 είναι απλά αρχικοποίηση. Η λογική του προγράμματος είναι : Μας δίνει ο χρήστης το πλήθος των μητρώων που θέλει να εισάγει (αυτό το διαβάζουμε με την scanf και το αποθηκεύουμε στην numMitroa). Πλέον η numMitroa δεν έχει τιμή μηδέν αλλά ότι έγραψε ο χρήστης. Στην συνέχεια ζητάμε από τον χρήστη να μας δώσει τους αριθμούς των μητρώων ένα-ένα (πρώτο for) και στη συνέχεια απλά τους τυπώνουμε (δεύτερο for) Υ.Γ. το έτρεξες το πρόγραμμα; Debug γνωρίζεις τι είναι; Υ.Γ. 2 Η malloc δεν είναι εντολή, αλλά συνάρτηση. Ναι γνωριζω την χρηση της scanf κ του debug νομιζω οτι την καταλαβα λοιπον!! σας ευχαριστω παρα πολυ ολους για την βοηθεια σας!!! ---------- Το μήνυμα προστέθηκε στις 13:21 ---------- ΑΑ και κατι τελευταιο!! η χρηση της malloc διαφερει καθολου στους δισδιαστατους πινακες?
jtsc21 Δημοσ. 6 Σεπτεμβρίου 2009 Δημοσ. 6 Σεπτεμβρίου 2009 Μη το μπερδευεις με τους πινακες οντως.πολλοι τα συγχεουν αλλο πινακες και αλλο δεικτες απλα εχουν καποιου ειδους συγγενεια
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.