Kezdőoldal » Számítástechnika » Programozás » Valaki eltudja magyarázni,...

Valaki eltudja magyarázni, hogy miért viselkedik így ez a rövid kód? C++

Figyelt kérdés

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ó?



2017. febr. 3. 11:36
 1/7 anonim ***** válasza:
Felfedezted az operációs rendszer egyik védelmét. Ugyanis egy memóriaterületet csak akkor írhatsz, ha az a te programodhoz tartozik. Különben megakadályozza azt és leállítja a programodat.
2017. febr. 3. 11:47
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:

"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.

2017. febr. 3. 11:52
Hasznos számodra ez a válasz?
 3/7 A kérdező kommentje:
Köszönöm a válaszokat!
2017. febr. 3. 12:03
 4/7 |Orfeusz| ***** válasza:

Megoldás: így hozd létre a pointert:

int tiz = 10;

int *p = &tiz;


vagy:

int *x;

x = new int;

*x = 10;

2017. febr. 3. 12:11
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:

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.

2017. febr. 3. 12:21
Hasznos számodra ez a válasz?
 6/7 A kérdező kommentje:

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.

2017. febr. 3. 12:36
 7/7 anonim ***** válasza:

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.

2017. febr. 4. 09:11
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!