Basis van programmeren in C

Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?

  1. ADe standaard eist dat dit tijdens de uitvoering als fout wordt gedetecteerd, dus in elke omgeving drukt het programma een foutmelding af en stopt het
  2. BNULL is vastgelegd als wijzend naar adres 0, dus in elke omgeving wordt de inhoud van adres 0 gelezen en gaat de verwerking door
  3. CHet is ongedefinieerd gedrag; onder een besturingssysteem crasht het programma in het algemeen, maar op een microcontroller zonder MMU kan adres 0 leesbaar zijn en blijft de fout soms onopgemerkt
Antwoord en toelichting tonen

Antwoord: C. Het is ongedefinieerd gedrag; onder een besturingssysteem crasht het programma in het algemeen, maar op een microcontroller zonder MMU kan adres 0 leesbaar zijn en blijft de fout soms onopgemerkt

Het derefereren van een NULL-pointer is ongedefinieerd gedrag, en de standaard zegt niet wat er gebeurt. Linux en Windows wijzen rond adres 0 geen pagina's toe, dus een dereferentie veroorzaakt een page fault (paginafout) en het programma wordt in het algemeen abnormaal beëindigd (op Linux bijvoorbeeld met een segmentation fault). Op een kleine microcontroller zonder MMU kan op adres 0 flashgeheugen of de tabel met interruptvectoren staan en leesbaar zijn, zodat de fout tot verkeerd gedrag leidt zonder ooit zichtbaar te worden. Het is belangrijk om vóór het gebruik van een pointer te controleren dat die niet NULL is.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. 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?
  2. 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?
  3. Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?
  4. Wat is de uitvoer als de bovenstaande code, die de met #define gedefinieerde macro SQUARE gebruikt, wordt uitgevoerd?
  5. Het headerbestand sensor.h is geschreven zoals hierboven. Wat is het doel van de drie regels #ifndef, #define en #endif?