Memória eloszlás malloc () és sa11os ()
Elosztott Memória: malloc () és sa11os ()
A programnak biztosítania kell a megfelelő mennyiségű memória adattárolásra használni. Néhány ilyen memória sejtek oszlanak automatikusan. Például azt mondhatjuk
char helye [] = "Bay sertés máj";
és ez lesz a memóriát, tárolásához elegendő a húr.
Vagy mi lehet konkrétabb és kérjen egy bizonyos mennyiségű memóriát:
Ez a leírás kiosztja 100 memória sejtek, amelyek mindegyike tárolására szolgáló, egy egész számot.
C nyelv nem áll meg ott. Ez lehetővé teszi, hogy fordítsanak több memóriát a futás során. Például tegyük fel, hogy írjon egy interaktív program, és nem tudom előre, hogy mennyi adatot kell megadnia. Megadhatja a kívánt (hogyan érzi magát) memóriában, majd ha szükséges, többet követelni. Ábra. 15.5 ábra példát mutat, amely a funkció malloc (). hogy nem csak ezt. Szintén figyelni, hogy egy ilyen program a mutató.
/ * Add a memóriát, ha szükséges * /
#define STOP „” / * a felmondás a bemeneti jel * /
#define BLOCK 100 / * bájt memóriát * /
#define LIM 40 / * korlátozzák a hossza a bemeneti vonal * /
#define MAX 50 / * maximális számú bemeneti vonala * /
char tárolni [BLOCK]; / * A forrás memória blokk * /
char symph [LIM]; / * Beviteli vevő vonalak * /
char * végén; / * Végét jelzi memória * /
char * kezdődik [MAX]; / * Jelzi a kezdetét sor * /
int index = 0; / * Száma bemeneti sor * /
int számítanak; / * * Counter /
char * malloc (); / * * Allocator /
end = kezdődik [0] + BLOKK - 1;
helyezi ( „Mik a szimfonikus zenekar.”);
helyezi ( "Adjon meg egy: nyomja meg az [Enter] az elején");
helyezi ( „húr, hogy a teljes lista Oké, kész vagyok.”);
while (strcmp (fgets (symph, LIM stdin), STOP)! = 0 index helyezi ( „Várj egy kicsit, megpróbálom megtalálni a memóriát.”); end = kezdődik [index] + BLOKK - 1; A (count = 0; count strcpy (kezdődik [index], symph); kezdődik [index + 1] = kezdődik [index] + strlen (symph) + 1; printf ( "Ez .. Rajta, ha akarja." index);> helyezi ( „Oké, itt van, amit kaptam:”); A (count = 0; count Ábra. 15.5. A program, amely hozzáteszi, a memória igény. Itt egy példa a munkaprogram: Melyek szimfonikus zenekarok zenekarok. Írja őket egyenként; Nyomja meg az [Enter] billentyűt elején vonal teljes listánkat. Oké, kész vagyok. 1. Tartsa meg, ha akarod. Ez 2 folytatása, ha akarja. Ez a 3. Folytatás, ha akarja. Ez 4. Folytassa, ha akarja. London Symphony Ezt 5. Folytassa, ha akarja. bécsi Filharmonikusok Várj egy percet. Megpróbálom megtalálni a memóriát. 6. Folytassa Ez, ha úgy tetszik. 7. Folytassa, ha akarja. Nos, itt van, amit kaptam: Először is nézzük meg, mi teszi a funkció malloc (). Tart egy érv, mint egy előjel nélküli egész szám, amely képviseli a bájtok számát a memória szükséges. Így, malloc (BLOCK) igényel 100 byte. A függvény visszaad egy pointert a char a kezdete egy új blokk memória. Régebben a leírást hogy figyelmeztesse a fordítónak, hogy malloc () visszaad egy pointert a char. Ezért hozzá az értéke indexbejegyzés kezdődik array [index] segítségével az üzemeltető Nos, nézzük úgy a program tervezetét, amely abban áll, hogy memorizálni a forrás sorokat a sorban egy nagy tömb tárolja. Azt szeretnénk használni elindul a [0] olvassa el az elején az első sorban, kezdődik [l] - .. A második sor stb Időközben, a program belép egy string tömb symph. Mi használtuk fgets () helyett, hogy (). hogy korlátozza a bemeneti string array symph hosszát. Ábra. 15.6. Az egymást követő symph vonal írt a tömbben tárolni. Mielőtt bemásolod symph tárolni. ellenőriznünk kell, hogy van-e elég hely marad meg. Index vége utal, hogy a végén a memória és az aktuális érték kezdődik [index] utal, hogy az elején a fel nem használt memória. Így tudjuk összehasonlítani a különbség a két mutató hossza symph és hogy van-e elegendő memória. Ha a hely nem elegendő, hívja malloc (). hogy készítsen további memóriát. Mi meg elindul [index] elején új blokk memória, a végén - a végén az új blokk. Vegyük észre, hogy nincs a neve az új memóriát. Nem például a bővítés a boltban. Elég csak hivatkozni indexek hivatkozó új memóriaterület. Amikor a program fut, minden egyes új sor kezdődik, pointerek hivatkozott tömb elem. Néhány sor tartogat. mások - egy vagy több új területeket memóriát. De amíg van egy mutató, tudunk dolgozni húrok, megmutatja egy része a program, amely elvégzi a nyomtatást. Így Mallos használt (). De tegyük fel, hogy dolgozni szeretne egy int memóriát. helyett char. És fel lehet használni itt Mallos (). Íme: char * malloc (); / * Még leírni, mint egy mutatót a char * / newmem = (int *) malloc (l00); / * A fenti művelet típusát * / Ismét, 100 byte szükséges. Működés betűöntő átalakítja a visszaadott mutató char típusú. az egy int mutatót. Ha, mint a mi rendszerünkben, int foglal két bájt memóriát, ami azt jelenti, hogy newmem + 1 növeli a mutatót két bájt, azaz a. E. történő áthelyezéshez a következő egész számra. Ez azt is jelenti, hogy a 100 byte lehet tárolására használt 50 egészek. Egy másik lehetőség a memória kiosztás ad nekünk a használat sallos () függvényt. newmem = (hosszú *) calloc (100, sizeof (hosszú)); Mint malloc () függvény sallos () visszaad egy pointert char. Be kell használni a leadott szereplő típusú, ha azt szeretnénk, hogy emlékezzen egy másik típusú. Ez az új funkció két érv, mindkettő kell előjel nélküli egész. Az első érvelés tartalmaz a szükséges számú memória sejtek. A második érv - a mérete minden cella bájtban. A mi esetünkben, mi használ négy bájt hosszú, így az üzemeltető osztja 100 négybájtos elemek használatával általában 400 bájt memóriát. Alkalmazása a sizeof (hosszú) helyett 4 tettünk ezt a programot több mobil. Ez fog futni a rendszerekben, ahol hosszú a mérete eltér négy. sallos () függvény egy másik jellemzője; kitisztítja a blokk tartalmát. A C könyvtár valószínűleg számos más memória-menedzsment funkciókat, és érdemes ellenőrizni őket. Share az oldalon