myle Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 Πώς μπορώ να σιγουρευτώ ότι έχω κάνει allocate (δεσμεύση) κάποιες θέσεις μνήμης όταν έχω χρησιμοποιήσει πχ. την malloc. Θέλω κάτι όπως το να μου τυπώσει τις δεσμευμένες θέσεις μνήμης, ή την αρχή και το τέλος. Απλά να ξέρω ότι όντως έγινε στις συγκεκριμένες θέσεις μνήμης.
Ros_Original Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 Enan tupwseis san %p ton pointer, tote 8a sou dwsei th dieu8unsh autou tou pointer.
Crizzt Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 prwta #include<cassert.h>/#include<assert.h> analoga an eisai C/C++ kai meta opou to xreiazesai: assert(pointer); an den exei ginei to allocation tha sto pei
Directx Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 Επίσης, όταν η 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; } //---------------------------------------------------------------------------
unre@l Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 to "getch();" de xreiazetai sorry, den krati8ika! LOL!
Directx Δημοσ. 17 Νοεμβρίου 2006 Δημοσ. 17 Νοεμβρίου 2006 to "getch();" de xreiazetai Χρειάζεται διότι το παράδειγμα είναι γραμμένο ως Windows console, οπότε φίλε Crizzt δίχως αυτήν την εντολή το παράθυρο (DOS-BOX) θα έκλεινε αυτόματα πριν προλάβουμε να διαβάσουμε τα ανάλογα printf όταν το εκκινούμε βέβαια εκτός της γραμμής εντολών (CLI)
Crizzt Δημοσ. 18 Νοεμβρίου 2006 Δημοσ. 18 Νοεμβρίου 2006 Swstos o Directx. Omologw oti de to exw xrisimopoieisei pote...
myle Δημοσ. 18 Νοεμβρίου 2006 Μέλος Δημοσ. 18 Νοεμβρίου 2006 Ευχαριστώ πολύ για την βοήθεια παιδιά. Να 'στε καλά. Την βιβλιοθήκη cassert.h δεν την είχε ή απλά δεν την έβρισκε ο compiler στο ένα σύστημα που δοκίμασα. Πάντως με βάση τις συμβουλές σας βρήκα την λύση. Σας ευχαριστώ πολύ. offtopic: Το ίδιο γίνεται και με την system("pause"); που νομίζω βολεύει και καλύτερα, ή αν βάλεις break point στο πρόγραμμα σου κατά την εκσφαλμάτωση (κοινώς debugging)
Crizzt Δημοσ. 18 Νοεμβρίου 2006 Δημοσ. 18 Νοεμβρίου 2006 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
myle Δημοσ. 18 Νοεμβρίου 2006 Μέλος Δημοσ. 18 Νοεμβρίου 2006 Γιατί έτσι και αλλιώς θα την σβήσεις αυτή την γραμμή. Το καλύτερο πιστεύω πάντως ότι είναι να φτιάξεις μια συντόμευση του cmd και να βάλεις να ανοίγει στο directory που δουλεύεις τώρα. Για linux, 1 κουμπί είναι έτσι και αλλιώς η κονσόλα οπότε δεν τίθεται θέμα.
Sta Δημοσ. 19 Νοεμβρίου 2006 Δημοσ. 19 Νοεμβρίου 2006 Αν μιλάμε για Standard C, τότε αρκεί να ελέγξεις αν το αποτέλεσμα που επιστρέφει η malloc (στην οποία δε χρειάζεται και επίσης δεν πρέπει να κάνεις cast) είναι NULL ή όχι. Επίσης, το αποτέλεσμα του printf("%p",...) είναι implementation specific και δεν πρέπει να βασίζεσαι σε αυτό. Τα παραπάνω αν μιλάμε για Standard C.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.