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

Malloc


Firetrooper

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

Δημοσ.

Παιδες θα ηθελα την βοηθεια σας σχετικα με το προβλημα που λεγεται malloc στην C!! θα μπορουσε καποιος να μου δειξει την χρηση της και να μου εξηγησει καπως πως λειτουργει? διαβαζω απο δω διαβαζω απο κει και δεν καταλαβαινω τπτ!!! ευχαριστω εκ των προτερων

Δημοσ.

Μπορείς να φτιάξεις έναν πίνακα 10 χαρακτήρων με την πρόταση char str[10]. Αυτό είναι στατική δομή και πολλές φορές δεν εξυπηρετεί. Υπάρχουν τρόποι να χρησιμοποιήσεις μια δυναμική κατανομή μνήμης (οι λόγοι γι' αυτό είναι πολλοί και μπορείς να τους διαβάσεις ίσως στη wikipedia). Για παράδειγμα, για να έχεις αποτέλεσμα αντίστοιχο με το παραπάνω με malloc, θα έκανες char* str = (char*)malloc(10*sizeof(char)).

 

Η sizeof() επιστρέφει το μέγεθος που απαιτείται για ένα στοιχείο του τύπου που δηλώνει το όρισμά της. Πολλαπλασιασμένο επί 10, δίνει το μέγεθος που απαιτείται για αποθήκευση 10 τέτοιων στοιχείων. Η malloc παίρνει αυτή την παράσταση ως όρισμα και κρατάει τόση μνήμη. Το cast (char*) λέει πως αυτή η μνήμη που εξασφάλισε η malloc θα επιστραφεί με τη μορφή char* (γιατί αυτού του τύπου είναι η μεταβλητή στην οποία την αναθέτουμε).

Δημοσ.

H malloc οριζεται εκει που οριζονται και οι μεταβλητες? και μετα αν τυχει να χρησιμοποιησουμε μια επαναληψη για εναν πινακα δυναμικα δεσμευμενο στην επαναληψη for (i =0 ,i++ , i< ? ; )τι θα βαλουμε στην θεση του ερωτηματικου?

Δημοσ.
γτ ? δεν επιτρεπεται να διατυπωνω την οποιαδηποτε απορια εχω πανω στον προγραμματισμο? ή μηπως υπαρχει thread που να ειναι ειδικα γ αποριες πανω στην C και δεν το ειδα?

 

με παρεξηγησες...το δικο μου ποστ ειπα να διαγραφει γιατι ειχα γραψει κατι και μετα ηθελα να το σβησω.δεν ειπα να διαγραφει το θεμα σου:-)

Δημοσ.
με παρεξηγησες...το δικο μου ποστ ειπα να διαγραφει γιατι ειχα γραψει κατι και μετα ηθελα να το σβησω.δεν ειπα να διαγραφει το θεμα σου:-)

 

χιλια συγγνωμη τοτε! απλα τρεχω καιρο με αυτην την εντολη και οταν ειδα αυτο τρελαθηκα! πραγματικα συγγνωμη!!!

Δημοσ.

Έστω ότι θες να φτιάξεις ένα πρόγραμμα που θα κρατάει αριθμούς μητρώων (πελατών, μαθητών - φαντάσου κάτι). Δεν ξέρεις όμως πόσα ονόματα θα κρατήσεις πριν τρέξει ο χρήστης το πρόγραμμα.

 

Άρα δεν μπορείς να δηλώσεις έναν πίνακα π.χ.

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)

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

Δημοσ.

post-103086-129063022511_thumb.jpg

 

Η 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;

*Αν κανω κατι λαθος θα με διορθωσουν

Δημοσ.
με μπερδεψε λιγο το numMitroa ... γτ 0 και ποια η χρηση του?τι υποδυκνειει με αλλα λογια

 

Διάβασε τον κώδικα ...

scanf -> γνωρίζεις την χρήση της?

Η τιμή 0 είναι απλά αρχικοποίηση.

 

Η λογική του προγράμματος είναι :

Μας δίνει ο χρήστης το πλήθος των μητρώων που θέλει να εισάγει (αυτό το διαβάζουμε με την scanf και το αποθηκεύουμε στην numMitroa).

 

Πλέον η numMitroa δεν έχει τιμή μηδέν αλλά ότι έγραψε ο χρήστης.

 

Στην συνέχεια ζητάμε από τον χρήστη να μας δώσει τους αριθμούς των μητρώων ένα-ένα (πρώτο for)

και στη συνέχεια απλά τους τυπώνουμε (δεύτερο for)

 

Υ.Γ. το έτρεξες το πρόγραμμα; Debug γνωρίζεις τι είναι;

Υ.Γ. 2 Η malloc δεν είναι εντολή, αλλά συνάρτηση.

Δημοσ.

Βασηκα ψαξου για memory, memory stack, memory heap, memory overflow, memory underflow, menory allocation, memory reallocation, memory clean, win32 memory allocation.... etc...

 

+ memory address, memory virtual address και αλλα πολλα

Δημοσ.
Διάβασε τον κώδικα ...

scanf -> γνωρίζεις την χρήση της?

Η τιμή 0 είναι απλά αρχικοποίηση.

 

Η λογική του προγράμματος είναι :

Μας δίνει ο χρήστης το πλήθος των μητρώων που θέλει να εισάγει (αυτό το διαβάζουμε με την scanf και το αποθηκεύουμε στην numMitroa).

 

Πλέον η numMitroa δεν έχει τιμή μηδέν αλλά ότι έγραψε ο χρήστης.

 

Στην συνέχεια ζητάμε από τον χρήστη να μας δώσει τους αριθμούς των μητρώων ένα-ένα (πρώτο for)

και στη συνέχεια απλά τους τυπώνουμε (δεύτερο for)

 

Υ.Γ. το έτρεξες το πρόγραμμα; Debug γνωρίζεις τι είναι;

Υ.Γ. 2 Η malloc δεν είναι εντολή, αλλά συνάρτηση.

Ναι γνωριζω την χρηση της scanf κ του debug :) νομιζω οτι την καταλαβα λοιπον!! σας ευχαριστω παρα πολυ ολους για την βοηθεια σας!!!

 

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

 

ΑΑ και κατι τελευταιο!! η χρηση της malloc διαφερει καθολου στους δισδιαστατους πινακες?

Δημοσ.
Μη το μπερδευεις με τους πινακες

 

οντως.πολλοι τα συγχεουν

αλλο πινακες και αλλο δεικτες

απλα εχουν καποιου ειδους συγγενεια

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

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

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