Hogy tudok C-ben dinamikus memóriaméretű sztringet csinálni anélkül, hogy előre tudnám a méretet?
A feladat a következő: A program kérje be a felhasználó nevét. A név sztring mérete akkora legyen, amennyi karaktert beír a felhasználó. Ennek ugye nyilván az az értelme, hogy ne foglaljunk feleslegesen sok memóriát előre.
Viszont anélkül, hogy csinálnék egy sztringet, és abba beolvasnám a nevet, annak megnézném a hosszát, és ezt a hosszot adnám a malloc()-ba, nem tudom hogy lehetne. Így meg elveszne a dinamikus foglalás lényege...
"Láncolt listával kell megvalósítanod a stringet. Persze akkor egy UTF8-as string karakterenként egy pointer + 4 byte méretet fog felvenni. (Ami általában 6 vagy 8 byte)"
"Bocsánat: az UTF8 az 1 byte + mutató méretet vesz fel. Az UTF16 az pedig csak 4 vagy 6 byte. Elszámoltam magam. Szóval annyira nem durva a helyzet."
Uhh. Az UTF8-as karakter NEM 1 byte, hanem LEGALÁBB egy, illetve az UTF16 ugyanez, csak legalább 2 byte.
A feladatkiírás az, hogy ne foglaljunk feleslegesen memóriát. Ezt egy láncolt adatszerkezet arcon köpi, és az is, ha nagyobb blokkonként foglalod a memóriát.
Világos, én 1 byte-os karakterekkel számoltam (ASCII karakterek). Nyilván ha több bájtos a karakter, akkor mindegyikhez külön adódik hozzá a mutató. Ez arányos a sima bufferrel, hiszen ott is, mint itt, ha 2-ször annyi byte-ból áll a sorozat, 2x akkora lesz a szükséges tárterület.
Egyébként a feladatkiírást, ha alaposabban elolvasnád, pont azt szerepelt, hogy ne foglaljunk le feleslegesen sok memóriát ELŐRE. Vagyis nem az, hogy minél kevesebb memóriát haszánljunk, hanem az, hogy ne legyen lefoglalt, de üresen hagyott terület. Szerintem ez a feladatkiírás pont a láncolt listák megvalósítására illeszkedik, de a realloc megoldás is pontosan megfelel. Ha mondjuk sok műveletet is kellene velük végezni, akkor gondolkodás nélkül láncolt listákat javasolnék. (Bár ugye attól függ, milyen műveletet...)
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!