Basis van programmeren in C

int process(int n) {
    int *buf = malloc(n * sizeof(int));
    if (buf == NULL) return -1;
    if (fill(buf, n) != 0)
        return -2;
    use(buf, n);
    free(buf);
    return 0;
}

fill en use zijn elders gedefinieerde functies. Wat is een probleem van de bovenstaande functie?

  1. AAls fill een waarde ongelijk aan 0 teruggeeft, keert de functie terug zonder buf vrij te geven, dus het gereserveerde gebied blijft achter zonder te worden vrijgegeven
  2. BDe retourwaarde van malloc wordt niet gecontroleerd, dus bij een mislukte reservering wordt een NULL-pointer gederefereerd
  3. Cbuf wordt na free gebruikt, dus een vrijgegeven gebied wordt benaderd
Antwoord en toelichting tonen

Antwoord: A. Als fill een waarde ongelijk aan 0 teruggeeft, keert de functie terug zonder buf vrij te geven, dus het gereserveerde gebied blijft achter zonder te worden vrijgegeven

Een met malloc gereserveerd gebied blijft bestaan tot het met free wordt vrijgegeven. Op het pad waarbij fill mislukt en de functie met return -2 terugkeert, wordt free niet aangeroepen en gaat de waarde (het adres) van buf verloren, zodat dat gebied nooit meer kan worden vrijgegeven. Dit heet een geheugenlek; als de functie herhaaldelijk wordt aangeroepen, krimpt het bruikbare geheugen steeds verder, wat vooral een probleem is voor embedded apparaten en servers die lang draaien. Roep free(buf) aan vóór het terugkeren, of breng het vrijgeven samen op één plek aan het einde van de functie.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Wat is juist over de pointer die de bovenstaande functie make teruggeeft?
  2. Wat is in C de meest passende reden waarom wordt aangeraden om direct na free(p); de regel p = NULL; te schrijven?
  3. De string "ABCDEFGH" van 8 tekens werd aan de bovenstaande functie save doorgegeven. Wat gebeurt er?
  4. Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?
  5. Neem een gebruikelijke omgeving aan waarin char 1 byte en int 4 bytes is, en int op adressen wordt geplaatst die een veelvoud van 4 zijn. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?