Basis van programmeren in C

int *make(void) {
    int x = 42;
    return &x;
}

Wat is juist over de pointer die de bovenstaande functie make teruggeeft?

  1. Ax blijft tot het einde van het programma op dezelfde plek staan, dus via de teruggegeven pointer kan altijd veilig 42 worden gelezen
  2. Bx wordt bij het terugkeren naar de heap verplaatst, dus de aanroeper moet het na gebruik met free vrijgeven
  3. CDe levensduur van x eindigt als de functie terugkeert, dus de teruggegeven pointer wijst naar een ongeldige plek, en gebruik ervan is ongedefinieerd gedrag
Antwoord en toelichting tonen

Antwoord: C. De levensduur van x eindigt als de functie terugkeert, dus de teruggegeven pointer wijst naar een ongeldige plek, en gebruik ervan is ongedefinieerd gedrag

x is een lokale variabele zonder static (een automatische variabele); haar levensduur eindigt als de functie terugkeert, en de plek op de stack die ze innam, wordt door andere functieaanroepen hergebruikt. Een pointer die wijst naar een gebied waarvan de levensduur is afgelopen, heet een dangling pointer, en lezen of schrijven via zo'n pointer is ongedefinieerd gedrag. gcc geeft voor deze code een waarschuwing en kan zelfs code genereren die NULL teruggeeft. Geef de waarde zelf terug, of gebruik een gebied dat de aanroeper heeft voorbereid of dat met malloc is gereserveerd.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Wat is in C de meest passende reden waarom wordt aangeraden om direct na free(p); de regel p = NULL; te schrijven?
  2. De string "ABCDEFGH" van 8 tekens werd aan de bovenstaande functie save doorgegeven. Wat gebeurt er?
  3. Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?
  4. 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?
  5. uint32_t en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?