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

Memory allocation στην C


myle

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

Δημοσ.

Πώς μπορώ να σιγουρευτώ ότι έχω κάνει allocate (δεσμεύση) κάποιες θέσεις μνήμης όταν έχω χρησιμοποιήσει πχ. την malloc.

Θέλω κάτι όπως το να μου τυπώσει τις δεσμευμένες θέσεις μνήμης, ή την αρχή και το τέλος. Απλά να ξέρω ότι όντως έγινε στις συγκεκριμένες θέσεις μνήμης.

Δημοσ.

Επίσης, όταν η malloc δεν μπορεί να δεσμεύσει το ζητηθέν μέγεθος μνήμης επιστρέφει πάντα NULL.

 

Για να δεις την διεύθυνση μνήμης μιας μεταβλητής ορίζεις & και ύστερα το όνομα της - αυτό που λαμβάνεις σε Windows 32bit είναι η διεύθυνση μνήμης της σε μορφή DWORD σε 16bit λειτουργικά τα πράγματα είναι διαφορετικά, για να είσαι σίγουρος λοιπόν ότι πάντα θα παρουσιάζεται η σωστή διεύθυνση μνήμης όπου και αν εκτελεσθεί ο κώδικας σου (16bit / 32bit Λ.Σ.) χρησιμοποιείς την %p στην printf.

 

Ο παρακάτω κώδικας, γραμμένος σε Borland Turbo C++ Express, δεσμεύει (malloc) ένα char των 512 bytes μνήμης (511 bytes ωφέλημα, διότι μετράμε και το μηδέν), ελέγχει εάν έχουν δεσμευθεί επιτυχώς (!=NULL) και ύστερα επιστρέφει (printf %p) την διεύθυνση μνήμης που αρχίζουν τα δεδομένα μας (&pszBuffer[0]) και εκείνη όπου τελειώνουν (&pszBuffer[511]).

 

>
//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#pragma hdrstop

//---------------------------------------------------------------------------
char	*pszBuffer = NULL;
//---------------------------------------------------------------------------

int main(int argc, char* argv[])
{
  if((pszBuffer=(char*)malloc(512))!=NULL)
{
  printf("Start-End: %p - %p",&pszBuffer[0],&pszBuffer[511]);
  free(pszBuffer);
}
  else
printf(" Not enough memory!\n");

  getch();
  return 0;
}
//---------------------------------------------------------------------------

Δημοσ.
to "getch();" de xreiazetai

 

Χρειάζεται διότι το παράδειγμα είναι γραμμένο ως Windows console, οπότε φίλε Crizzt δίχως αυτήν την εντολή το παράθυρο (DOS-BOX) θα έκλεινε αυτόματα πριν προλάβουμε να διαβάσουμε τα ανάλογα printf όταν το εκκινούμε βέβαια εκτός της γραμμής εντολών (CLI) :D

Δημοσ.

Ευχαριστώ πολύ για την βοήθεια παιδιά. Να 'στε καλά.

Την βιβλιοθήκη cassert.h δεν την είχε ή απλά δεν την έβρισκε ο compiler στο ένα σύστημα που δοκίμασα. Πάντως με βάση τις συμβουλές σας βρήκα την λύση. Σας ευχαριστώ πολύ.

 

offtopic: Το ίδιο γίνεται και με την system("pause"); που νομίζω βολεύει και καλύτερα, ή αν βάλεις break point στο πρόγραμμα σου κατά την εκσφαλμάτωση (κοινώς debugging)

Δημοσ.

gia to system("pause"), ontws isxiei, alla mono gia win system kai giati na xrisimopoieiseis ena allo programma gia na kaneis ti douleia sou (pause.exe) enw tin kaneis mesa sto diko sou programma ;)

Δημοσ.

Γιατί έτσι και αλλιώς θα την σβήσεις αυτή την γραμμή. Το καλύτερο πιστεύω πάντως ότι είναι να φτιάξεις μια συντόμευση του cmd και να βάλεις να ανοίγει στο directory που δουλεύεις τώρα.

Για linux, 1 κουμπί είναι έτσι και αλλιώς η κονσόλα οπότε δεν τίθεται θέμα.

Δημοσ.

Αν μιλάμε για Standard C, τότε αρκεί να ελέγξεις αν το αποτέλεσμα που επιστρέφει η malloc (στην οποία δε χρειάζεται και επίσης δεν πρέπει να κάνεις cast) είναι NULL ή όχι.

 

Επίσης, το αποτέλεσμα του printf("%p",...) είναι implementation specific και δεν πρέπει να βασίζεσαι σε αυτό. Τα παραπάνω αν μιλάμε για Standard C.

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

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

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