C++ ban miért nem tudok inicializálni egy char* típusú változót úgy ahogy máshol mondják, hogy lehet?
char* c = "valami";
a hiba: error C2440: 'initializing': cannot convert from 'const char [7]' to 'char *'
Visual Studio 2017 et használok.
Nemlehet hogy karaktersorozatot akarsz char mutatóhoz hozzáadni.
char* c = &(("valami")[0])
// v karakter memóriacímének eltárolása c mutatóban.
Nemtudom hogy jó e így vagy lehet félreértelmezem a feladatot ezért kíméljenek mert nagyon rég használtam ezt a nyelvet s alig emlékszem sok mindenre.
A probléma az, hogy a szabványt mindegyik tanító oldal, és fordító másképp használja, pedig elég egyértelmű. Amit te így deklarálsz nullterminált karakterláncot, az egy konstans globális memóriaterületen lesz. Mivel konstans, ezért nem lehet változtatni később. A legtöbb fordító talán megengedi, hogy így add meg helyette:
char c[] = "valami"
És ekkor működhet. De ez sem biztos hogy szabványos, már régen tanultam.
De ha ilyen gondok vannak, akkor std::string osztály kéne neked szerintem.
Szia!
Megpróbálom röviden elmagyarázni, hogy mi történik a háttérben (és miért hibás a kód, amit letöltöttél):
- C-ben és C++-ban ha egy string literált használsz (tehát egy string konkrét értékét beírod idézőjelek közé a kódban), akkor kb. a következő történik:
- a fordító egy olyan programot hoz létre, ahol még a main() függvény elindulása előtt foglal egy kevés plusz memóriát
- ez a kevés plusz memória tartalmazza a string-et, amit beleírtál a kódodba
- amikor olyan részhez ér a programod, ahol használni akarod ezt a string-et, ebből a globális memóriából olvassa ki
- ha több helyen ugyanazt a string-et írod be a kódba, akkor általában csak egyszer tárolja el a fordító, és ugyanonnan fogja kiolvasni
Na most nyílván, ha ezt a globális memóriát te át tudnád írni, akkor lehetséges lenne, hogy az egyik kódrészletnél átírod ezt a memóriát, és egy másik kódrészletnél véletlenül hibás értéket olvasol majd ki.
Ezt megelőzendő elég szigorúan veszik, hogy az ilyen memóriákat ne tudd átírni, és ennek megfelelően egy "char const *" típusú pointer mutat erre a területre (tehát egy konstans karakterekből álló memóriaterületre mutató pointer).
A C nyelv nagyon régi változatai nem ismerték a const kulcsszót egyáltalán, és emiatt ott nyílván ez a fent leírt pár sor nem áll fenn. A nagyon régi C kódokkal való kompatibilitás érdekében a 98-as C++ szabványban hozzáadtak egy plusz pontot, ami lehetővé teszit string literálok konverzióját sima "char *" típusra, viszont ez ma már nem támogatott.
Tehát a kód, amit letöltöttél valahonnan, egy viszonylag régi verziójával íródott a nyelvnek. Manapság az az általános "best practice", hogy mindenhol "char const *" típust, vagy az "auto" kulcsszót használjuk, ha string literálokkal dolgozunk. Én azt javaslom, hogy írd át mindenhol a kódot, később jobban jársz vele, ha beleteszel ennyi energiát.
Hajrá!
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!