Valaki eltudja magyarázni, hogy miért viselkedik így ez a rövid kód? C++
int main()
{
int *x;
*x=10;
std::cout << *x << "\t" << x << std::endl;
return 0;
}
Úgy hoztam létre egy mutatót, hogy ahhoz semmit, és azt semmihez se rendeltem, ami nem túl jó, mégis amikor a *x=10; sor nélkül lefuttatom, lefut a program, kiír egy random számot ami épp egy bizonyos memóriaterületen van, aminek a címét ki is írja utána. Vagyis kapott egy random címet is a mutatóm.
De ha a *x=10; sort beírom, a program kifagy.
Ebben most azt nem értem, hogy egyrészt miért kap random memóriacímet a mutatóm, másrészt miért nem tudok ahhoz értéket rendelni, ha már megteszi. Írásvédett minden memóriaterület egészen addig, amíg nem tartozik hozzá változó?
"Ebben most azt nem értem, hogy egyrészt miért kap random memóriacímet a mutatóm"
Azért, mert ha a változóidnak nem adsz kezdőértéket, akkor azok meghatározatlan értéket vesznek fel C-ben és C++-ban. Ez azért van, mert bár a memóriaterület, ahol a változód létrejött, az szabadnak van jelölve, de az előző tartalma nem lett törölve.
Megoldás: így hozd létre a pointert:
int tiz = 10;
int *p = &tiz;
vagy:
int *x;
x = new int;
*x = 10;
A C és C++ nem ad automatikus kezdőértéket egy deklarált változónak, tehát ha te ezt nem teszed meg, akkor az érték valami memóriaszemét lesz, amit nem tudsz meghatározni.
Ha meg deklarálsz egy mutatót (ami ugye memóriaszemétre fog mutatni alapból), a mutatott értéket ki tudod íratni, mert olvasni lehet a memóriát, de írásra nem férhet hozzá a program akármilyen memóriaterülethez (legalább is modern operációs rendszerek alatt nem), emiatt fagy ki a program, ha írni szeretnél.
ma 12:21
Belegondolva, tényleg nem lenne túl ideális, ha random írogathatnék át mindent a memóriában. Jelenleg futó alkalmazásokat is megzavarhatna, lefagyaszthatna.
Kiegészítés a 4-eshez:
ha egy memóriaterületet 'new'-val foglalsz le a 'heap'-en, akkor azt utána fel is kell szabadítanod, ha már nem használod, egy 'delete' hívással.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!