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