den kode returnerer en pointer som peger på memory der ikke er allokeret efter retur
hvis du bruger den så kan og vil andre funktioner have ændret den så den ikke er 5
a[*wildptr] vil så ikke være a[5] men a[-111111111111] og dit program vil crashe
eller det mempory bliver allokeret til noget andet og du sætter det *wildptr = 6 og du får noget andet korrekt kode til at crashe
Synes godt om
Slettet bruger
31. oktober 2005 - 18:21#2
At du returnerer en pointer til noget der er allokeret på stack-frame og som ikke er en gyldig position når functionen returnere så den er ikke rigtig god den funktion ;)
Den kan vel naermest gaa ind og aendre paa noget som et andet program har i brug?
Synes godt om
Slettet bruger
31. oktober 2005 - 18:32#8
Det kommer jo meget an på hvad man vælger at bruge den pointer til. Hvis man blot aflæser et en int value fra den sker der jo ikke andet end at værdien vil være forkert når programmet har kørt. Ja det i sig selv kan jo være slemt nopk hvis man skal bruge det program til noget. Være kan de gå hvis du begynder at skrive til, men hvad der sker er mere eller mindre tilfældigt.
Er det kun i Linux hvor programmerne har deres eget space paa stacken? Er det ikke i windows, hvor du har adgang til et faelles space saa man paa den maade kan fucke op i et andet kørende program?
Bertel jeg må lige høre, har jeg fat i noget af det rigtige hvis jeg siger at grunden til at det der virker er, at compileren ligger et bestemt adresse område ud til automatiske variabler og det der sker er så:
- int allokeres på adresse X - int går ud af scope, vi har dog stadig adressen i p - vi kan godt skrive til adressen - da det er valid adresse område for vores program - ny int allokeres på adressen X, da der ikke bør ligge noget - vi kan så udskrive variable på adressen X
Er dette ikke compiler specifikt, jeg mener ville det ikke kunne gå galt med andre compilere en g++?
Jo, det er meget compiler specifikt om det "virker". g++ og Digital Mars compilerne giver 123 og 321, BorlandC++ og Visual C++ giver et andre resultater.
Hvis vi holder os til standarden vil den sige at det er "undefind behavior", og så kan alt ske.
Ordentlige compilere giver en warning hvis man forsøger at returnere en pointer til en lokal variabel (som i func1) og hvis man forsøger at bruge en variabel der ikke er initialiseret (som i func2).
Et andet eksempel på et program med vild pointer der "virker": #include <iostream> int main() { int *p = new int [100]; delete [] p; p[40] = 12345678; p = new int [100]; std::cout << p[40] << std::endl; delete [] p; }
Det "virker" med alle de 4 compilere på windows som jeg har.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.