|
| Adresse i memory Fra : Socketd |
Dato : 25-09-02 02:05 |
|
Hej igen
Jeg er ved at læse Bjarnes "The C++ programming language - Special
Edition" og ved siden af den ligger w00w00-heap-overflows.
Jeg prøver at få w00w00's programmer til at virke i C++ (de er skrevet i
C), men hvordan får jeg den fysiske adreese på en variable? Samt en
funktion, en pointer og hvor pointeren peger hen? Jeg har selv prøvet:
char* test = new char[16];
cout<<"Adresse på test = "<<&test<<endl;
Men jeg kan ikke tro at dette er adressen. Ligemeget hvor mange gang jeg
kører nedstående program, så er adressen den samme. Også selv om jeg kører
programmet, stopper programmet og kører det samme program i et andet
vindue. I det tilfælde skulle adreesen jo ikke være den samme, da disse
to programmer kører uafhængigt af hinanden.
int main() {
char* test = new char[16];
char* test1 = new char[16];
cout<<"Adressen på test = "<<&test<<endl;
cout<<"Adressen på test1 = "<<&test1<<endl;
unsigned long diff = &test1 - &test;
cout<<"Forskellen er = "<<diff<<endl;
}
Giver dette:
Adressen på test = 0xbfbffb70
Adressen på test1 = 0xbfbffb6c
Forskellen er = 1
For det første synes jeg afstanden på de to char *'s er rimelig stor (jeg har en
x86 maskine), men diff er lig 1?
Egentlig vokser heap'en i modsatte retning, så det skulle være:
unsigned long diff = &test - &test1;
Men så bliver diff = 4294967295?
Håber nogen kan hjælpe mig med at forstå dette.
mvh
socketd
| |
Mogens Hansen (25-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 25-09-02 07:10 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.01.05.18.785624.223@traceroute.dk...
> Håber nogen kan hjælpe mig med at forstå dette.
Det du printer ud er adressen på variablen ("test" eller "test1").
Det er ikke værdien af variablen du printer - du printer altså ikke adressen
på de 2 array, der er allokeret med "new char [16]".
De 2 variable "test" og "test1" er automatiske variable - altså variable der
typisk er allokeret på stakken.
Det simpleste for compileren er at allokere dem lige ved siden af hinanden.
Derfor bliver forskellen - afstanden i hukommelsen mellem "test" og
"test1" - i det konkrete tilfælde "1 * sizeof(char*)", hvilket er 4 bytes på
din maskine.
Det vil de være uanset om der er allokeret noget hukommelse de peger på
eller ej.
Rækkefølgen som min compiler lægger variable på stakken er omvendt i forhold
til din - og det er ligegyldigt for man kan ikke basere sig på viden om
hvilken vej stakken vokser.
Det er forventeligt at adressen på variable på stakken er den sammen mellem
forskellige kørsler af af programmet.
Det er heller ikke ualmindeligt at allokeringer på heapen giver samme
adresser, hvis man kører samme sekvens af allokeringer.
Husk på at med en almindelig, moderne CPU på et moderne operativsystem, er
det ikke den fysiske adresse du ser - altså den man kan måle elektrisk på
adresse-benene med f.eks. en logik analysator.
Der foregår nogle mapninger via nogle tabeller (på x86 arkitekturen: GDT og
LDT - Global Descriptor Table og Local Descriptor Table) inden man har den
fysiske adresse - hvis den overhovedet findes for øjeblikket (virtual
memory). Disse tabeller sættes op af operativ-systemet. Applikationen kan
således nemt se den samme logiske adresse mellem forskellige kørsler, selvom
det er forskellige fysiske adresser.
Men hvordan får du så skrevet adressen på de 2 array, som er allokeret på
heapen, ud ?
Du skal skrive værdien af "test" og "test1" ud.
Typisk vil man gøre det med f.eks.:
cout << test;
men den er overloaded for "const char*", så man får skrevet den
nul-terminerede streng som "test" peger på ud - hvilket også er det man
typisk ønsker.
Hvis man vil have skrevet værdien ud, skal derfor man caste variablen til en
"void *" inden den skrives ud:
cout << static_cast<void*>(test);
Dit program bliver så
<code>
#include <iostream>
#include <cstddef> // type ptrdiff_t
#include <iomanip>
using namespace std;
int main()
{
char* test = new char[16];
char* test1 = new char[16];
cout << "Adressen på blokken test peger på = 0x" << hex <<
static_cast<void*>(test) << endl;
cout << "Adressen på blokken test1 peger på = 0x" << hex <<
static_cast<void*>(test1) << endl;
ptrdiff_t diff = test1 - test;
cout << "Forskellen er = " << diff << endl;
delete [] test1;
delete [] test;
}
</code>
Venlig hilsen
Mogens Hansen
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 11:31 |
|
On Wed, 25 Sep 2002 09:09:57 +0200, Mogens Hansen wrote:
> De 2 variable "test" og "test1" er automatiske variable - altså variable
> der typisk er allokeret på stakken.
På heap'en eftersom vi bruger "new" ikke?
Men tak for et godt svar
mvh
socketd
| |
Ivan Johansen (25-09-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 25-09-02 12:25 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.10.30.53.154839.219@traceroute.dk...
> On Wed, 25 Sep 2002 09:09:57 +0200, Mogens Hansen wrote:
>
> > De 2 variable "test" og "test1" er automatiske variable - altså variable
> > der typisk er allokeret på stakken.
>
> På heap'en eftersom vi bruger "new" ikke?
Nej, test og test1 allokeres på stacken, mens det test og test1 peger på
allokeres på heap'en.
Ivan Johansen
| |
Mogens Hansen (25-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 25-09-02 13:12 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.10.30.53.154839.219@traceroute.dk...
> On Wed, 25 Sep 2002 09:09:57 +0200, Mogens Hansen wrote:
>
> > De 2 variable "test" og "test1" er automatiske variable - altså variable
> > der typisk er allokeret på stakken.
>
> På heap'en eftersom vi bruger "new" ikke?
Nej.
"test" og "test1" i dit eksempel er automatiske variable - altså variable
der typisk allokeret på stakken.
De er _ikke_ allokerede på heapen.
Når du skriver
int main() {
char* test;
...
så er "test" en automatisk variabel af typen "char*", som har en udefineret
værdi.
Når du skriver
int main() {
char* test = 0;
...
så er "test" en automatisk variabel af typen "char*", som har værdien 0.
Når du skriver
int main() {
char* test = new char[16];
...
så er "test" en automatisk variabel af typen "char*", som har den værdi som
"new char[16]" returnerer - altså adressen på første element i arrayet på
heapen.
Værdien af "test" er en peger til en blok på heapen med plads til 16 char.
Du har altså 2 elementer:
* en "char*"
* en blok på heapen (som "test" peger på)
---- ------------------
|test| ---> | heap array[16] |
---- ------------------
Venlig hilsen
Mogens Hansen
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 13:39 |
|
On Wed, 25 Sep 2002 15:11:57 +0200, Mogens Hansen wrote:
> Nej.
> "test" og "test1" i dit eksempel er automatiske variable - altså
> variable der typisk allokeret på stakken. De er _ikke_ allokerede på
> heapen.
>
> Når du skriver
> int main() {
> char* test;
> ...
> så er "test" en automatisk variabel af typen "char*", som har en
> udefineret værdi.
>
> Når du skriver
> int main() {
> char* test = 0;
> ...
> så er "test" en automatisk variabel af typen "char*", som har værdien 0.
>
> Når du skriver
> int main() {
> char* test = new char[16];
> ...
> så er "test" en automatisk variabel af typen "char*", som har den værdi
> som "new char[16]" returnerer - altså adressen på første element i
> arrayet på heapen.
> Værdien af "test" er en peger til en blok på heapen med plads til 16
> char. Du har altså 2 elementer:
> * en "char*"
> * en blok på heapen (som "test" peger på)
>
> ---- ------------------
> |test| ---> | heap array[16] |
> ---- ------------------
Aha ok, takker
mvh
socketd
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 12:11 |
|
Hovsa, har lige nogle flere spørgsmål.
Jeg kunne også godt tænke mig at vide adressen på en pointer og hvilken
adresse den peger på. Fx:
int Tal1 = 0;
int* ptr_Tal1 = &Tal1;
cout<<"Adreesen på ptr_Tal1 = "<<ptr_Tal1<<endl;
Eller giver dette adressen på Tal1?
Men hvad hvis jeg vil have adressen på det den peger på? Eller hvis det
var omvendt, adressen på pointeren selv (da static_cast<void*> nemlig
giver samme resultat som ovenstående).
Vil at finde en funktion-pointers adresse og hvad den peger på være
det samme?
Hvis jeg nu ikke har en pointer til en funktion, hvordan finder jeg så
dens adresse? Jeg har prøvet med nedenstående:
#include <iostream>
#include <cstddef> // type ptrdiff_t
#include <iomanip>
using namespace std;
void Funktion() {
cout<<"Udskriver........"<<endl;
}
int main()
{
char* test = new char[16];
char* test1 = new char[16];
void (*ptr_to_Funktion) ();
ptr_to_Funktion = &Funktion; //Virker ikke hvis jeg fx har en
//"int Funktion"????? Hvad så?
cout << "Adressen paa blokken test peger paa = " << hex <<
static_cast<void*>(test) << endl;
cout << "Adressen paa blokken test1 peger paa = " << hex <<
static_cast<void*>(test1) << endl;
ptrdiff_t diff = test1 - test;
cout << "Forskellen er = " << diff << endl;
//cout<<"Adressen paa funktionen =
//"<<hex<<static_cast<void*>(Funktion)<<endl; Virker ikke
delete [] test1;
delete [] test;
}
mvh
socketd
| |
Ivan Johansen (25-09-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 25-09-02 12:32 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.11.11.11.921252.219@traceroute.dk...
> Jeg kunne også godt tænke mig at vide adressen på en pointer og hvilken
> adresse den peger på. Fx:
> int Tal1 = 0;
> int* ptr_Tal1 = &Tal1;
> cout<<"Adreesen på ptr_Tal1 = "<<ptr_Tal1<<endl;
> Eller giver dette adressen på Tal1?
Dette udskriver indholdet af ptr_Tal1, hvilket svarer til adressen på Tal1.
Hvis du vil have adressen på ptr_Tal1 bruges:
cout<<"Adreesen på ptr_Tal1 = "<<&ptr_Tal1<<endl;
> Hvis jeg nu ikke har en pointer til en funktion, hvordan finder jeg så
> dens adresse? Jeg har prøvet med nedenstående:
Prøv med:
#include <iostream>
using namespace std;
void Funktion() {
cout<<"Udskriver........"<<endl;
}
int main()
{
cout<<"Adressen paa funktionen =&Funktion<<endl;
}
Ivan Johansen
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 13:13 |
|
On Wed, 25 Sep 2002 14:31:43 +0200, Ivan Johansen wrote:
> Prøv med:
>
> #include <iostream>
> using namespace std;
>
> void Funktion() {
> cout<<"Udskriver........"<<endl;
> }
> int main()
> {
> cout<<"Adressen paa funktionen =&Funktion<<endl;
> }
Jeg har skrevet følgende:
#include <iostream>
#include <cstddef> // type ptrdiff_t
#include <iomanip>
using namespace std;
void Funktion() {
cout<<"Udskriver........"<<endl;
}
int main()
{
char* test = new char[16];
char* test1 = new char[16];
void (*ptr_to_Funktion) ();
int Tal1 = 0;
int* ptr_Tal1 = &Tal1;
cout << "Adressen paa Tal1 = " << hex <<&Tal1 << endl;
cout << "Adressen paa hvad ptr_Tal1 peger paa = " << hex <<ptr_Tal1<< endl;
cout << "Adressen paa ptr_Tal1 = " << hex <<&ptr_Tal1<< endl;
ptr_to_Funktion = &Funktion;
cout << "Adressen paa blokken test peger paa = " << hex <<
static_cast<void*>(test) << endl;
cout << "Adressen paa blokken test1 peger paa = " << hex <<
static_cast<void*>(test1) << endl;
ptrdiff_t diff = test1 - test;
cout << "Forskellen er = " << diff << endl;
cout<<"Adressen paa pointeren = "<<&ptr_to_Funktion<<endl;
cout<<"Pointeren peger paa = "<<ptr_to_Funktion<<endl;
cout<<"Adressen paa funktionen = "<<hex<<&Funktion<<endl;
delete [] test1;
delete [] test;
}
Som giver:
Adressen paa Tal1 = 0xbfbffb48
Adressen paa hvad ptr_Tal1 peger paa = 0xbfbffb48
Adressen paa ptr_Tal1 = 0xbfbffb44
Adressen paa blokken test peger paa = 0x804b030
Adressen paa blokken test1 peger paa = 0x804b040
Forskellen er = 10
Adressen paa pointeren = 0xbfbffb4c
Pointeren peger paa = 1
Adressen paa funktionen = 1
Kan det passe at i dette tilfælde, der ligger stakken på 0xbfbjff*** og
heap'en ligger på 0x804b*** (altså sådan ca). Og ved at bruge &variable
får vi adressen på variablen på stakken og med static_cast kan vi se heap
adressen? (hvorfor skal der bruges et cast?)
Men hvorfor peger ptr_to_Funktion på 1? Og hvordan får jeg adressen når
jeg ikke kan static_caste en funktion?
Og en sidste ting:
hvis jeg har en "int Funktion", hvordan skal jeg så:
ptr_to_Funktion = &Funktion;
Kompileren brokker sig over dette, da den ikke ved det er Funktion() jeg
angiver.
mvh
socketd
| |
Mogens Hansen (25-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 25-09-02 13:32 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.12.12.57.184153.219@traceroute.dk...
[8<8<8<]
> Kan det passe at i dette tilfælde, der ligger stakken på 0xbfbjff*** og
> heap'en ligger på 0x804b*** (altså sådan ca).
Ja.
Men heapen kan nemt ligge i mange forskellige områder.
> Men hvorfor peger ptr_to_Funktion på 1?
Det ligner en fejl i compileren.
Hvilken compiler bruger du ?
Dem jeg umiddelbart har prøvet med, udskriver adressen på funktionen.
[8<8<8<]
> Og en sidste ting:
> hvis jeg har en "int Funktion", hvordan skal jeg så:
> ptr_to_Funktion = &Funktion;
>
> Kompileren brokker sig over dette, da den ikke ved det er Funktion() jeg
> angiver.
Ja, den tager det navn der ligger næmest i scope.
Hvis funktionen er global og variabel er lokal kan du bruge scope resolutin
operator (side 82 og 228 i "The C++ Programming Language"):
<code>
#include <iostream>
#include <iomanip>
using namespace std;
void foo()
{
}
int main()
{
int foo;
void (*foo_ptr)() = &::foo;
cout << "local variable foo at : 0x" << hex << &foo << endl;
cout << "global function foo at: 0x" << hex << &::foo << endl;
}
</code>
Venlig hilsen
Mogens Hansen
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 13:44 |
|
On Wed, 25 Sep 2002 15:32:03 +0200, Mogens Hansen wrote:
>> Men hvorfor peger ptr_to_Funktion på 1?
>
> Det ligner en fejl i compileren.
> Hvilken compiler bruger du ?
> Dem jeg umiddelbart har prøvet med, udskriver adressen på funktionen.
Jeg bruger FreeBSD 4.6.2 med "g++".
> int main()
> {
> int foo;
> void (*foo_ptr)() = &::foo;
> cout << "local variable foo at : 0x" << hex << &foo << endl; cout <<
> "global function foo at: 0x" << hex << &::foo << endl;
> }
oki, takker, men hvad så hvis begge er global?
mvh
socketd
| |
Mogens Hansen (25-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 25-09-02 16:04 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.12.44.01.298839.219@traceroute.dk...
[8<8<8<]
> Jeg bruger FreeBSD 4.6.2 med "g++".
Jeg prøvede lige
<code>
#include <iostream>
#include <iomanip>
using namespace std;
void foo()
{
}
int main()
{
cout << "global function foo at: 0x" << hex << &::foo << endl;
}
</code>
med g++ V2.96 og V3.1 under Linux, og fik samme resultat som dig, med en
warning:
"warning: the address of 'foo ()', will always be 'true'".
g++ konverterer implicit "&foo" til en bool, hvilket jeg jeg ikke kan se er
lovligt. Herefter udskriver den værdien af bool.
De andre compilere jeg prøvede (under både MS-Windows og Linux) konverterer
implicit "pointer to function" til en "void*" inden de printes ud.
Den konvertering er dog ikke lovlig (se §5.10 i C++ Standarden, eller "The
C++ Programming Language", side 834).
Så vidt jeg umiddelbart kan se kan man ikke gøre andet med en "pointer to
function" end
* kalde funktionen som den peger på
* tildele den en værdi
* explicit konvertere den anden type "pointer to function"
og dermed kan man ikke portabelt få skrevet adressen ud på en stream.
Hvis man snakker om "pointer to member function", indeholder den ikke "blot"
en adresse i hukommelsen.
Det er særligt åbenlyst hvis member funktionen er virtuel.
[8<8<8]
> oki, takker, men hvad så hvis begge er global?
Prøv det.
(Hint: det er ulovligt.)
Venlig hilsen
Mogens Hansen
| |
Socketd (25-09-2002)
| Kommentar Fra : Socketd |
Dato : 25-09-02 21:50 |
|
On Wed, 25 Sep 2002 18:03:32 +0200, Mogens Hansen wrote:
> Så vidt jeg umiddelbart kan se kan man ikke gøre andet med en "pointer
> to function" end
> * kalde funktionen som den peger på
> * tildele den en værdi
> * explicit konvertere den anden type "pointer to function"
> og dermed kan man ikke portabelt få skrevet adressen ud på en stream.
Ok, så vi kan ikke finde en funktions adresse i memory?
>> oki, takker, men hvad så hvis begge er global?
>
> Prøv det.
> (Hint: det er ulovligt.)
Uha nej, jeg er ikke kriminel
mvh
socketd
| |
Ivan Johansen (25-09-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 25-09-02 22:07 |
|
Socketd wrote:
> Ok, så vi kan ikke finde en funktions adresse i memory?
Prøv med:
cout << hex << reinterpret_cast<int>(&Funktion);
Du skal bare være klar over at det ikke er kompatibelt. Det er ikke
sikkert at adressen kan være i en int, men det kan den højst sandsynligt
på din compiler.
Ivan Johansen
| |
Socketd (26-09-2002)
| Kommentar Fra : Socketd |
Dato : 26-09-02 00:59 |
|
On Thu, 26 Sep 2002 00:06:57 +0200, Ivan Johansen wrote:
> Socketd wrote:
>> Ok, så vi kan ikke finde en funktions adresse i memory?
>
> Prøv med:
> cout << hex << reinterpret_cast<int>(&Funktion);
>
> Du skal bare være klar over at det ikke er kompatibelt. Det er ikke
> sikkert at adressen kan være i en int, men det kan den højst sandsynligt
> på din compiler.
>
> Ivan Johansen
Jo, følgende virker:
cout<<"Adressen paa funktionen = "<<hex<<reinterpret_cast<unsigned
long>(&Funktion)<<endl;
men den skriver 80487f0 og ikke 0x80487f0, (alså med 0x foran) som den gør med fx:
cout<<"Adressen paa pointeren = "<<&ptr_to_Funktion<<endl; og
cout << "Adressen paa blokken test peger paa = " << hex <<
static_cast<void*>(test) << endl;
Dette er ikke noget stort problem, men hvorfor kommer der ikke et 0x
foran? Og er det normalt at funktioner ligger i heap'en?
mvh
socketd
| |
Mogens Hansen (26-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 26-09-02 06:01 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.25.23.58.50.773501.27036@traceroute.dk...
[8<8<8<]
> men den skriver 80487f0 og ikke 0x80487f0, (alså med 0x foran) som den gør
med fx:
> cout<<"Adressen paa pointeren = "<<&ptr_to_Funktion<<endl; og
> cout << "Adressen paa blokken test peger paa = " << hex <<
> static_cast<void*>(test) << endl;
Er du sikker på at der bliver skrevet "0x" ?
> Dette er ikke noget stort problem, men hvorfor kommer der ikke et 0x
> foran?
Fordi du ikke har skrevet det.
Prøv:
cout<<"Adressen paa pointeren = 0x"
> Og er det normalt at funktioner ligger i heap'en?
Nej.
Hvad får dig til at tro at den ligger på heapen (hint: det gør den ikke) ?
Program-koden og variabel hukommelsen (global, stack, heap) er i C++
adskilte og man kan ikke konvertere mellem de 2 typer områder.
Venlig hilsen
Mogens Hansen
| |
Socketd (26-09-2002)
| Kommentar Fra : Socketd |
Dato : 26-09-02 09:27 |
|
On Thu, 26 Sep 2002 08:00:41 +0200, Mogens Hansen wrote:
>> men den skriver 80487f0 og ikke 0x80487f0, (alså med 0x foran) som den
>> gør
> med fx:
>> cout<<"Adressen paa pointeren = "<<&ptr_to_Funktion<<endl; og cout <<
>> "Adressen paa blokken test peger paa = " << hex <<
>> static_cast<void*>(test) << endl;
>
> Er du sikker på at der bliver skrevet "0x" ?
Nedstående program giver nedstående output: #include <iostream>
#include <cstddef> // type ptrdiff_t #include <iomanip>
using namespace std;
void Funktion() {
cout<<"Udskriver........"<<endl;
}
}
int main()
{
char* test = new char[16];
char* test1 = new char[16];
void (*ptr_to_Funktion) ();
int Tal1 = 0;
int* ptr_Tal1 = &Tal1;
cout << "Adressen paa Tal1 = " << hex <<&Tal1 << endl; cout << "Adressen
paa hvad ptr_Tal1 peger paa = " << hex <<ptr_Tal1<< endl; cout <<
"Adressen paa ptr_Tal1 = " << hex <<&ptr_Tal1<< endl;
ptr_to_Funktion = &Funktion;
cout << "Adressen paa blokken test peger paa = " << hex <<
static_cast<void*>(test) << endl;
cout << "Adressen paa blokken test1 peger paa = " << hex <<
static_cast<void*>(test1) << endl;
unsigned long diff = &test1[0] - &test[0]; cout << "Forskellen
mellem test1 og test er = " << diff << endl;
cout<<"Adressen paa pointeren = "<<&ptr_to_Funktion<<endl;
cout<<"Pointeren peger paa = "<<ptr_to_Funktion<<endl; cout<<"Adressen
paa funktionen = "<<hex<<reinterpret_cast<unsigned
long>(&Funktion)<<endl;
delete [] test1;
delete [] test;
}
}
Adressen paa Tal1 = 0xbfbffb64
Adressen paa hvad ptr_Tal1 peger paa = 0xbfbffb64 Adressen paa ptr_Tal1 =
0xbfbffb60
Adressen paa blokken test peger paa = 0x804b030 Adressen paa blokken
test1 peger paa = 0x804b040 Forskellen mellem test1 og test er = 10
Adressen paa pointeren = 0xbfbffb68
Pointeren peger paa = 1
Adressen paa funktionen = 80487f0
Lidt underligt ikke, måske følger g++ ikke c++ standarden 100%?
>> Dette er ikke noget stort problem, men hvorfor kommer der ikke et 0x
>> foran?
>
> Fordi du ikke har skrevet det.
> Prøv:
> cout<<"Adressen paa pointeren = 0x"
Som sagt er der ikke behov for det de andre steder.
>> Og er det normalt at funktioner ligger i heap'en?
>
> Nej.
> Hvad får dig til at tro at den ligger på heapen (hint: det gør den ikke)
> ? Program-koden og variabel hukommelsen (global, stack, heap) er i C++
> adskilte og man kan ikke konvertere mellem de 2 typer områder.
Ok, bare fordi funktionens adresse er 80487f0 og fx test1s, som ligger paa
heap'en, er 804b040, det er da tæt på Er der en måde at finde heap'ens
start adresse på? og måske størrelsen på heap'en (som den er nu, da den jo
kan vokse).
mvh
socketd
| |
Mogens Hansen (29-09-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 29-09-02 15:38 |
|
"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.26.08.26.34.90666.222@traceroute.dk...
[8<8<8<]
> Lidt underligt ikke, måske følger g++ ikke c++ standarden 100%?
Jeg har ikke set at C++ Standarden siger noget om det.
[8<8<8<]
> Er der en måde at finde heap'ens
> start adresse på? og måske størrelsen på heap'en (som den er nu, da den jo
> kan vokse).
Ikke portabelt, men der findes ofte et implementerings specifikt API som man
kan bruge.
Venlig hilsen
Mogens Hansen
| |
Socketd (29-09-2002)
| Kommentar Fra : Socketd |
Dato : 29-09-02 18:47 |
|
On Sun, 29 Sep 2002 17:37:57 +0200, Mogens Hansen wrote:
>> Er der en måde at finde heap'ens
>> start adresse på? og måske størrelsen på heap'en (som den er nu, da den
>> jo kan vokse).
>
> Ikke portabelt, men der findes ofte et implementerings specifikt API som
> man kan bruge.
Oki, jeg takker
mvh
socketd
| |
Jens Axel Søgaard (25-09-2002)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 25-09-02 22:27 |
|
> On Wed, 25 Sep 2002 18:03:32 +0200, Mogens Hansen wrote:
>> Så vidt jeg umiddelbart kan se kan man ikke gøre andet
>> med en "pointer to function" end
>> * kalde funktionen som den peger på
>> * tildele den en værdi
>> * explicit konvertere den anden type "pointer to
>> function" og dermed kan man ikke portabelt få skrevet
>> adressen ud på en stream.
Kan man ikke sammenligne den med en anden "pointer to function"?
--
Jens Axel Søgaard
| |
Byrial Jensen (26-09-2002)
| Kommentar Fra : Byrial Jensen |
Dato : 26-09-02 19:20 |
|
Jens Axel Søgaard <usenet@soegaard.net> skrev:
>> On Wed, 25 Sep 2002 18:03:32 +0200, Mogens Hansen wrote:
>>> Så vidt jeg umiddelbart kan se kan man ikke gøre andet
>>> med en "pointer to function" end
>>> * kalde funktionen som den peger på
>>> * tildele den en værdi
>>> * explicit konvertere den anden type "pointer to
>>> function" og dermed kan man ikke portabelt få skrevet
>>> adressen ud på en stream.
>
> Kan man ikke sammenligne den med en anden "pointer to function"?
For C er svaret delvist ja:
En funktionspointer kan i C sammenlignes for lighed (==) eller
ulighed (!=) med andre funktionspointere af samme type og med en
null pointer.
Desuden kan en funktionspointer i C konverteres til en heltalstype
som er stor nok til at rumme dens værdi /hvis/ en sådan type
findes. Det er ikke et krav at der skal findes en sådan type.
| |
Jens Axel Søgaard (26-09-2002)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 26-09-02 21:27 |
|
Byrial Jensen wrote:
> Jens Axel Søgaard <usenet@soegaard.net> skrev:
>> Kan man ikke sammenligne den med en anden "pointer to
>> function"?
>
> For C er svaret delvist ja:
>
> En funktionspointer kan i C sammenlignes for lighed (==)
> eller ulighed (!=) med andre funktionspointere af samme
> type og med en null pointer.
Fint.
--
Jens Axel Søgaard
| |
Thomas Lykkeberg (26-09-2002)
| Kommentar Fra : Thomas Lykkeberg |
Dato : 26-09-02 18:28 |
|
On Wed, 25 Sep 2002 14:12:57 +0200, Socketd <db@traceroute.dk> wrote:
>Og en sidste ting:
>hvis jeg har en "int Funktion", hvordan skal jeg så:
>ptr_to_Funktion = &Funktion;
>
>Kompileren brokker sig over dette, da den ikke ved det er Funktion() jeg
>angiver.
Den her fik du vist aldrig svar på i virvarret af heap, stack og
global storage
func1 er en pointer til en funktion som modtager void og returnerer
void
void (*func1)(void);
func2 er en pointer til en funktion som modtager void og returnerer
int
int (*func2)(void);
Du kan IKKE tildele func1 til func2 og omvendt. Du kan ikke typecaste
dig ud af denne situation.
/Thomas
| |
Igor V. Rafienko (26-09-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 26-09-02 18:37 |
|
[ Thomas Lykkeberg ]
[ ... ]
> void (*func1)(void);
:
> int (*func2)(void);
>
> Du kan IKKE tildele func1 til func2 og omvendt. Du kan ikke
> typecaste dig ud af denne situation.
Neivel? Hva med 5.2.10, p 6?
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
Socketd (26-09-2002)
| Kommentar Fra : Socketd |
Dato : 26-09-02 19:07 |
|
On Thu, 26 Sep 2002 20:27:55 +0200, Thomas Lykkeberg wrote:
>>Og en sidste ting:
>>hvis jeg har en "int Funktion", hvordan skal jeg så: ptr_to_Funktion =
>>&Funktion;
>>
>>Kompileren brokker sig over dette, da den ikke ved det er Funktion() jeg
>>angiver.
> Den her fik du vist aldrig svar på i virvarret af heap, stack og global
> storage
>
> func1 er en pointer til en funktion som modtager void og returnerer void
>
> void (*func1)(void);
>
> func2 er en pointer til en funktion som modtager void og returnerer int
>
> int (*func2)(void);
>
> Du kan IKKE tildele func1 til func2 og omvendt. Du kan ikke typecaste
> dig ud af denne situation.
Ok, men jeg mente nu
int Funktion;
og ikke
int Funktion();
mvh
socketd
| |
Socketd (05-10-2002)
| Kommentar Fra : Socketd |
Dato : 05-10-02 19:42 |
|
Hey igen igen
Igen læser jeg om et par ting i C som jeg gerne vil gøre i C++. Hvordan
udskriver jeg hvad der er i registerne (deres værdi)? Altså , AX/BX/DX/CX og EP/SP
o.s.v?
mvh
socketd
| |
Ivan Johansen (05-10-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 05-10-02 19:54 |
|
Socketd wrote:
> Igen læser jeg om et par ting i C som jeg gerne vil gøre i C++. Hvordan
> udskriver jeg hvad der er i registerne (deres værdi)? Altså , AX/BX/DX/CX og EP/SP
> o.s.v?
Hvorfor ønsker du at udskrive indeholdet af registrene?
Hvilke registre der findes afhænger af processoren. Derfor står der
intet om registre hverken i C eller C++ standarden. Om det kan lade sig
gøre og hvordan er du derfor nødt til at slå op i dokumentationen til
din compiler.
Du skal dog være klar over at du risikerer at ændre registrenes indhold
ved at udskrive dem. Hvis du vil se registrenes indhold er den eneste
sikre måde derfor at anvende en debugger.
Ivan Johansen
| |
Socketd (05-10-2002)
| Kommentar Fra : Socketd |
Dato : 05-10-02 20:18 |
|
On Sat, 05 Oct 2002 21:54:12 +0200, Ivan Johansen wrote:
> Socketd wrote:
> Hvorfor ønsker du at udskrive indeholdet af registrene? Hvilke registre
> der findes afhænger af processoren. Derfor står der intet om registre
> hverken i C eller C++ standarden. Om det kan lade sig gøre og hvordan er
> du derfor nødt til at slå op i dokumentationen til din compiler.
Bare for sjov egentlig.
> Du skal dog være klar over at du risikerer at ændre registrenes indhold
> ved at udskrive dem. Hvis du vil se registrenes indhold er den eneste
> sikre måde derfor at anvende en debugger.
Oki, takker for svaret.
mvh
socketd
| |
Bertel Lund Hansen (05-10-2002)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 05-10-02 22:08 |
|
Socketd skrev:
>> Hvorfor ønsker du at udskrive indeholdet af registrene?
>Bare for sjov egentlig.
Det kan lade sig gøre hvis man kan komme ned på assemblerniveau
og pushe alle registre. Derefter kan man poppe dem ud på nogle
kendte hukommelsespladser. Men man skal holde tungen mere end
lige i munden for ikke at lave katastrofer eller blot for at
finde ud af at få det til at virke rigtigt.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Socketd (05-10-2002)
| Kommentar Fra : Socketd |
Dato : 05-10-02 23:23 |
|
On Sun, 06 Oct 2002 00:08:02 +0200, Bertel Lund Hansen wrote:
> Socketd skrev:
>
>>> Hvorfor ønsker du at udskrive indeholdet af registrene?
>>Bare for sjov egentlig.
>
> Det kan lade sig gøre hvis man kan komme ned på assemblerniveau og pushe
> alle registre. Derefter kan man poppe dem ud på nogle kendte
> hukommelsespladser. Men man skal holde tungen mere end lige i munden for
> ikke at lave katastrofer eller blot for at finde ud af at få det til at
> virke rigtigt.
Jep, jeg ville bare gerne vide om det var muligt i C++
mvh
socketd
| |
|
|