Miért van az, hogy C++-ban, ha kiíratok valamilyen szám változó értékét úgy, hogy nem adtam meg neki kezdőértéket, és a felhasználótól sem kértem be, akkor a kiírt érték valamilyen szám lesz?
A szám (char, short, int, float, double, stb. azaz a primitív típusok) deklarációnál csak memóriát foglal magának, értéket nem állít be. Értéke az a memóriaszemét lesz, ami véletlenül pont azon a memóriaterületen volt ahova a program memóriát foglalt a változónak.
A string egy osztály, nem primitív típus, aminek a default konstruktora egy üres strinet hoz létre. Tehát amikor létrehozol egy stringet, lefut egy kód ami beállítja a string értékét és hosszát.
A char karakter szintén szám, amíg nem definálod bármi lehet az értéke.
Ezt memóriaszemétnek nevezik.
Egy definiàlt vàltozó màr létezik ezért kell hogy legyen valahol a memóriàban és ha ott előzőleg ott maradt pl egy 5 szàm akkor az lesz az alapértelmezett értéke.
"deklaràciónàl csak helyet foglal magànak"
Ez nem igaz egy vàltozó ami deklaràlt nem létezik még csak a forditóval tudassuk,hogy lesz egy ilyen tipusú és nevű vàltozó valahol. Minimum definiàltnak kell lennie ahhoz hogy létezhessen.
Ki is próbàlhatod ha gondolod.
extern int a // Deklaràció
Utànna pedig próbàld ki íratni a memóriacímét.Nem fog menni mert nem létezik.
@#5:
"extern int var" azt mondja meg hogy majd a linker találni fog egy "int var" változót az egyik fordítási egységben. Nem azt hogy deklarálni akarsz egy ilyen változót. Ezt mi sem egyszerűbb bizonyítani mint hogy megpróbálsz adni neki egy értéket:
extern int var;
var = 5;
Ha igazad van akkor a var = 5 foglalni fog magának területet és beírja az 5-öt oda.
Ha nincs igazad akkor a var nem létezik mert nincs még deklarálva és a var = 5 nem fog tudni lefutni, mert a var nincs deklarálva még.
* * * *
Az deklarációnál létrehozzuk a változót és felkészítjük a használatra, csak éppen nem feltétlenül adunk neki értéket. Ez egy lokális változónál a stack mutató (ESP regiszter x86-on) csökkentését jelenti, heap esetében pedig a területet írhatóvá teszi (implementáció függő) azaz lefoglalja. Ha ez nem lenne akkor definiálásnál azaz az első értékadásnál elszállna a program SEGFAULT-al.
Egy deklarált de nem definiált változónak is van memóriacíme, és senki nem fog arra a címre írni, ebben biztos lehetsz. Mégpedig azért nem mert le van foglalva.
@Kérdező:
Ha egy char típusú változónak amit nem definiáltál 0 az értéke, az csak véletlen. Éppen 0 volt azon a memóriaterületen.
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!