Kezdőoldal » Számítástechnika » Programozás » C++ ban miért nem tudok...

Tomi 11 kérdése:

C++ ban miért nem tudok inicializálni egy char* típusú változót úgy ahogy máshol mondják, hogy lehet?

Figyelt kérdés

char* c = "valami";


a hiba: error C2440: 'initializing': cannot convert from 'const char [7]' to 'char *'


Visual Studio 2017 et használok.



2021. jan. 3. 16:39
 1/5 anonim ***** válasza:
100%
const char* c = "valami" -re írd át
2021. jan. 3. 16:40
Hasznos számodra ez a válasz?
 2/5 A kérdező kommentje:
arra én is rájöttem, de ez nem megoldás mert a fő probláma hogy letöltöttem egy forráskodot és abban nem akarom mindenhol átalakítani
2021. jan. 3. 16:43
 3/5 anonim ***** válasza:

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.

2021. jan. 3. 17:26
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
100%

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.

2021. jan. 3. 19:56
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:
100%

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á!

2021. jan. 3. 23:14
Hasznos számodra ez a válasz?

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

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!