Kada ir kodėl naudoti malloc?

Na, aš negaliu suprasti, kada ir kodėl turėčiau skirti atminties su „ malloc .

Čia yra mano kodas:

 #include <stdlib.h> int main(int argc, const char *argv[]) { typedef struct { char *name; char *sex; int age; } student; //Now I can do two things student p; //or student *ptr = (student *)malloc(sizeof(student)); return 0; } 

Kodėl turiu priskirti atmintį, kai galiu naudoti student p; ?

30
10 янв. rinkinys pr1m3x 10 sausis 2012-01-10 11:40 '12 11:40 2012-01-10 11:40
@ 5 atsakymai

malloc naudojamas dinaminei atmintinei paskirstyti. Kaip minėta, tai yra dinamiškas paskirstymas, o tai reiškia, kad skiriate atmintį vykdymo metu. Pavyzdžiui, kai nežinote kompiliavimo laiko atminties.

Vienas iš pavyzdžių - tai pašalinti. Pasakyk man, žinote, kad bus ne daugiau kaip 20 studentų. Taigi, galite sukurti masyvą su statiniais 20 elementais. Jūsų masyvas turės ne daugiau kaip 20 studentų. Bet kas, jei nežinote studentų skaičiaus? Tarkime, pirmasis įrašas yra studentų skaičius. Tai gali būti 10, 20, 50 ar kažkas kita. Dabar įvesite n = mokinių skaičių paleisties metu ir dinamiškai paskirstykite šią dinaminę atmintį naudodami malloc .

Tai tik vienas pavyzdys. Yra daug situacijų, kai reikalingas dinamiškas paskirstymas.

Žr. Malloc (3) puslapį.

30
10 янв. atsakymas, kurį pateikė taskinoor 10 sausis 2012-01-10 11:46 '12, 11:46, 2012-01-10 11:46

Naudodamiesi „ malloc , turite priskirti objektus, kurie turi egzistuoti už dabartinės bloko srities ribų (kur taip pat kainuos kopijavimas grįžtamuoju būdu), arba jei jums reikia skirti daugiau atminties nei šio kamino dydis (t. bloga idėja).

border=0

Prieš pradėdamas diegti „V99“, jums reikėjo paskirstyti ir dinaminį dydį, tačiau jums reikia sukurti dinamines duomenų struktūras, pvz., Medžius, sąrašus ir eiles, kurias naudoja daugelis sistemų. Turbūt yra daug daugiau priežasčių, tai tik keletas.

13
10 янв. atsakymas, kurį pateikė Necrolis 10 sausis 2012-01-10 11:45 '12, 11:45, 2012-01-10 11:45

Mes šiek tiek suskaidome pavyzdžio struktūrą, apsvarstykite šiuos dalykus:

 #include <stdio.h> int main(int argc, const char *argv[]) { typedef struct { char* name; char* sex; char* insurace; int age; int yearInSchool; float tuitionDue; }student; //Now I can do two things student p; //or student *p = (student *)malloc(sizeof(student)); return 0 } 

C a yra kalba, kuri netiesiogiai perduodama pagal vertę, o ne nuoroda. Šiame pavyzdyje, jei išlaikėme „p“ funkcijas, kad galėtume atlikti tam tikrą darbą, mes sukursime visos struktūros kopiją. Jis naudoja papildomą atmintį (bendras erdvės kiekis, kurio reikės konkrečiai struktūrai), yra lėtesnis ir nėra potencialiai masto (daugiau apie tai per minutę). Tačiau, praėjus * p, mes neperkeliame visos struktūros. Mes perduodame tik tą atmintyje nurodytą adresą, kuris nurodo šią struktūrą. Perduotų duomenų kiekis yra mažesnis (rodyklės dydis), todėl operacija atliekama greičiau.

Dabar, žinodami tai, įsivaizduokite programą (pavyzdžiui, studentų informacinę sistemą), kuri turės sukurti ir tvarkyti įrašų rinkinį tūkstančiais ar net dešimtimis tūkstančių. Jei perduodate visą struktūrą pagal vertę, darbui su duomenų rinkiniu užtruks daugiau laiko, nei tiesiog perkelia žymeklį į kiekvieną įrašą.

8
28 нояб. atsakymą pateikė ArcticPhoenix 28 lapkritis 2012-11-28 03:07 '12: 03:07 2012-11-28 03:07

malloc = Atminties priskyrimas.

Jei naudojote kitas programavimo kalbas, galbūt naudojote raktinį žodį „naujas“.

„Malloc“ atlieka tą patį „C“. Tai užima parametrą, kurį reikia priskirti atminties dydžiui, ir grąžina rodyklės kintamąjį, nurodantį pirmąjį atminties bloką.

visą atminties bloką. Pavyzdys yra

 int *p = malloc(sizeof(int)*10); 

Dabar * p nurodys atmintyje saugomą visą sveikojo skaičiaus 20 blokų pirmąjį bloką.

Galite pereiti per kiekvieną bloką, naudodami ++ ir - operatorius. Visi geriausi.

1
10 янв. atsakymas pateikiamas Acn 10 d 2012-01-10 11:47 '12, 11:47, 2012-01-10 11:47

Šiame pavyzdyje jis atrodo visiškai nenaudingas. Bet dabar įsivaizduokite, kad naudojate lizdus arba IO failą ir turite perskaityti kintamo ilgio paketus, kuriuos galite paleisti tik paleidžiant. Arba, naudojant lizdas ir kiekvieną kliento ryšį, reikia tam tikro saugojimo serveryje. Galite sukurti statinį masyvą, tačiau tai suteiks jums kliento apribojimą, kuris bus sugrąžintas kompiliavimo metu.

0
10 янв. Atsakymas pateikiamas DipSwitch 10 jan. 2012-01-10 11:48 '12, 11:48, 2012-01-10 11:48