Win32 memory map ?
Jos muistan oikein, niin WIN32 -ympäristössä (sovelluksen omassa 32-bit flat -muistiavaruudessa) offsetit väliltä 0-65535 ovat pysyvästi kelvottomia muistiosoitteita; tämän tarkoituksena on ilmeisesti ollut taata hyvä todennäköisyys sille, että jos erehdyksessä yrittää viitata muistiin osoittimella, jonka arvo on 0 (C: NULL , Objectpascal: NIL), niin tämä johtaisi "Access violation" -poikkeukseen sen sijasta, että ohjelma käsittelisi vääriä muistipaikkoja.
miksikö 64 kiTavun muistialue ?
Ilmeisesti tarkoituksena on ollut näin varmistaa se , että kun useimmat tietueet ovat kooltaan < 64k, niin nollaosoittimella tietueen mihin tahansa kenttään aiheuttaa silti poikkeuksen.
Yritin googlettaa varmistusta tälle muistikuvalle, mutta tämä:
windows memory map
ei löytänyt haluttua tulosta.
Debuggaan siis juuri koodia, jossa kirjastofunktio palauttaa ilmeisesti kelvottoman muistiosoitteen.
Jos muistan oikein, niin WIN32 -ympäristössä (sovelluksen omassa 32-bit flat -muistiavaruudessa) offsetit väliltä 0-65535 ovat pysyvästi kelvottomia muistiosoitteita; tämän tarkoituksena on ilmeisesti ollut taata hyvä todennäköisyys sille, että jos erehdyksessä yrittää viitata muistiin osoittimella, jonka arvo on 0 (C: NULL , Objectpascal: NIL), niin tämä johtaisi "Access violation" -poikkeukseen sen sijasta, että ohjelma käsittelisi vääriä muistipaikkoja.
miksikö 64 kiTavun muistialue ?
Ilmeisesti tarkoituksena on ollut näin varmistaa se , että kun useimmat tietueet ovat kooltaan < 64k, niin nollaosoittimella tietueen mihin tahansa kenttään aiheuttaa silti poikkeuksen.
Yritin googlettaa varmistusta tälle muistikuvalle, mutta tämä:
windows memory map
ei löytänyt haluttua tulosta.
Debuggaan siis juuri koodia, jossa kirjastofunktio palauttaa ilmeisesti kelvottoman muistiosoitteen.
Vastaukset 3
Vanhimmat
>kirjastofunktio palauttaa ilmeisesti kelvottoman
>muistiosoitteen.
Miten et voi olla varma siitä, että funkkari palauttaa kelvottoman muistiviittauksen? Aika fataalia.
"Miten et voi olla varma siitä, että funkkari palauttaa kelvottoman muistiviittauksen? Aika fataalia."
No kelvottomaltahan tuo vaikuttaa:
Aiheuttaa käytettäessä "Access violation" -poikkeuksen ja lisäksi osoittimen arvo tulkittuna 32-bit etumerkittömänä kokonaislukuna
Yleensä x86 käyttiksissä nollasta ylöspäin on varattu prosessin koodille. Osoitteessa nolla sijaitsee 32-bittinen vakio nolla. Siitä ylöspäin on yleensä koodia ja kiinteää vakiodataa. Muistiavaruus jatkuu 2 GB:hen asti (Win32 ja muistaakseni Linux:kin), jonka jälkeen alkaa vastaava avaruus dynaamisille kirjastoille. Koska Win32 Api sisältää tuhansia funktioita, niin oli kiva tietää mitä funkkaria yrität käyttää. Ja miten. Jotta voisi vähän täsmällisemmin yrittää vastata.