Paras vastaus
Oletan, että tiedät, että kun suoritat C-ohjelmaa, sinulla on 3 avointa tiedostoa, joista kaksi on nimeltään STDOUT ja STDERR, normaalit viestit menevät vakiotilaan (eli kun soitat printf: lle) ja virheilmoitukset stderr: ksi (kun soitat esimerkiksi fprintf (stderr, …), käyttöjärjestelmäsi linkittää nämä kaksi (itse asiassa avoimet tiedostot) päätelaitteeseesi, joka on Unix-pääte tai Windows-pääte. Niiden tärkein piirre on, että ne voidaan ohjata uudelleen esimerkiksi Unixissa, kun teet: ls | grep file.txt shell uudelleenohjaus stdout ”ls”: ssä ja nyt tuotoksen kohde on STDIN ”grep” -prosessissa, joten grep voi etsiä malleja tuolta virralta jne. Tämä on tehokasta tavaraa, monet Unix-suodattimet (itse ohjelmat) on rakennettu tällä tavalla, mikä on tehokasta. / p>
MUOKKAA: lisää merkityksellisempi esimerkki Haluan lisätä uuden ja selkeämmän uudelleenohjauksen käytön, jotta voit tarttua asiaan merkittävämmällä esimerkillä. Katso tämä komento:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Täällä curl alkaa ladata wget-tiedostoa GNU-projektista, kun curl lataa tietoja, joita se kirjoittaa STDOUT: lle, mutta kuori on ohjannut curl-käyrän xzat-stdiniksi, shell tekee sama, ohjaa xzcatin vakiotiedon tervan stdiiniksi ja terva alkaa purkaa tietoja, hämmästyttävä!
Vastaa
Ensinnäkin yleinen periaate: mitä tahansa teetkin, malloc()
ei koskaan käynnistetä automaattisesti.
Kun ilmoitat struct
, ilmoitat tyypin. Tyyppi itsessään, ei kuluta muistia ajon aikana.
Kun ilmoitat rakennetyypin muuttujan, muisti varataan sille, mutta ei käyttämällä malloc()
. Jos muuttuja on paikallinen funktiolle, sen muisti on yleensä varattu pinolle, mikä tekee osittain rekursiivisuuden mahdolliseksi C: ssä: joka kerta kun soitat funktiolle (vaikka sitä kutsutaan itsestään), pinon osoitinta säädetään ja lokille on varattu uusi tila pinossa kaikki kyseisen funktion muuttujat, ja joka kerta kun funktiosta poistutaan, pino ”puretaan”, jolloin kaikki tila vapautuu.
Kun ilmoitat globaalin muuttujan, sille määritetään staattinen allokointi kasan, kun ohjelma käynnistyy, ja muuttuja pysyy käytettävissä koko ohjelman suorittamisen ajan. Vaadittu kasan koko tunnetaan kääntöhetkellä.
Sen sijaan, kun käytät malloc()
, käyttöjärjestelmä jakaa muistia dynaamisesti suorituksen aikana ohjelmalle ja olet vastuussa sen vapauttamisesta käyttämällä free()
, tai ohjelmasi (varsinkin jos se on ohjelma, joka toimii pitkään ilman uudelleenkäynnistystä, esim. palvelusovellus) kärsii muistivuoto, mikä vaikuttaa suorituskykyyn ja äärimmäisessä tapauksessa koko resurssijärjestelmän nälkään. malloc()
-sovelluksen käyttö on sopivinta, kun joko a) vaadittu muistimäärä on enemmän kuin kasalle tai pinolle voidaan kohdistaa, tai b) vaadittavaa muistia ei ole tiedossa etukäteen.