Array tetszőleges hosszúságú és memória dinamikus egy köteg
Array tetszőleges hosszúságú és dinamikus memóriafoglalás a verem
A C90 nem lehetséges, hogy hozzon létre egy sor tetszőleges hosszúságú. a tömb méretét kell ismert fordításkor
A C99 szabvány, a lehetőséget, hogy hozzon létre egy tömb, amelynek mérete nem ismert fordítási időben. Például lehetőség van arra, hogy utalja át a feladatokat a tömb, és hozzon létre egy ideiglenes tömb
Array tetszőleges hosszúságú nem lehet inicializálunk létrehozása. Például, a következő kód nem fordul le
Tette (látszólag), biztonsági okokból. Ha azt szeretnénk, hogy töltse ki az értékeket a tömb, hogy meg lehet csinálni elemenként, vagy például a memset funkciót.
Mindazonáltal VSE nem támogatja ezt az újítást, és nem fog a jövőben.
Hogyan dinamikusan létrehozni egy sor tetszőleges méretű verem? Nyilvánvaló, hogy szükségünk van egy funkció, amely lehetővé tenné, hogy a memóriát a veremben. Ez a funkció az ALLOCA vagy _alloca és határozza meg a könyvtár malloc.h
(Itt és másutt a nem szabványos funkciók van egy előtaggal aláhúzás. A GNU fordító verziók nem). Mivel memóriát a veremben, nincs szükség kitörölni - kilépés után a függvény verem helyreáll és a lokális változók „elpusztult”. Ezen túlmenően, a memória kiosztás nagyon gyors (több nagyságrenddel gyorsabb, mint a felosztás a kupac), és nem vezet töredezettség.
De itt felmerül ugyanaz a probléma, mint a tömbök tetszőleges hosszúságú - ha osztja túl sok memóriát, a stack túlcsordulás következik be. _alloca funkció, szemben a malloc, visszatér NULL, ha nem tud memóriát, és létrehoz egy strukturált veremtúlcsordulás kivétel. Például, hívja
Ezért kínál olyan módszer,
Ez nem túl szép. Felszabadítása után kilép a funkció, és nem azt követően túlmutató látszat. _alloca funkció később betiltották, és helyébe egy funkciót _malloca. Ez abban különbözik, hogy először megpróbálja kiosztani helyet a stack, és ha ezt nem tudják megtenni, akkor osztja helyet a kupac, azaz úgy működik, mint a malloc. Azonban, ha a memória lehet rendelni a kupac, akkor szükség van, hogy kiadja mögött. Erre a célra _freea funkciót. Amikor a memóriát a veremben, a funkció nem csinál semmit. Amikor a memóriát a kupac, majd _freea elengedi, mint a standard ingyen. Ez az ár a biztonságosabb használatát.
malloca amikor memórialefoglalás a kupac viselkedik malloc. Azaz, ha a memória nem kell elkülöníteni a kupac, akkor vissza NULL.
Megjegyzés: _malloca memóriát fog a verem csak kiadás. A hibakeresés változata a projekt memória mindig osztják a kupac.
ru-Cyrl 18- bemutató Sypachev S. S. 1989/04/14 [email protected] Stepan Sypachev diákok