ProgrammatieC-ontwikkelaar

Hoe wordt er met strings gewerkt in C? Leg het verschil uit tussen een karakterarray en een pointer naar een string. Hoe voorkom je fouten bij het werken met strings?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In de taal C worden strings geïmplementeerd als karakterarrays die eindigen met een null-byte ('\0'). Voorbeeld van een string-declaratie:

char str1[] = "hello"; // Array met 6 karakters: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Pointer naar een stringliteral
  • Karakterarray: Het reserveert geheugen voor elk element, inclusief de afsluitende nul. Een array kan worden gewijzigd (als het niet const is).
  • Pointer naar een string: Kan verwijzen naar een stringliteral (die niet kan worden gewijzigd), of naar een gereserveerd geheugenblok. Een stringliteral wordt meestal opgeslagen in een read-only segment.

Om fouten te vermijden:

  • Beheer geheugen correct (gebruik malloc, strcpy, controleer de buffer-grootte).
  • Gebruik geen stringliteralen voor het wijzigen van strings.
  • Controleer of alle strings eindigen met \0.

Voorbeeld van correcte stringverwerking:

char buffer[100]; strcpy(buffer, "test"); // OK, buffer is wijzigbaar en bevat gegarandeerd '\0'

Vragenuitleg

Wat is het resultaat van het uitvoeren van de volgende code en welke fouten zal dit veroorzaken?

char *str = "hello"; str[0] = 'H'; printf("%s\n", str);

Antwoord: Het programma zal leiden tot ongecontroleerd gedrag, waarschijnlijk een segmentatiefout, omdat string literals in een geheugenruimte alleen voor lezen worden geplaatst. Het is niet toegestaan waarden naar het adres van een stringliteral te schrijven.

Voorbeelden van echte fouten als gevolg van een gebrek aan kennis over de nuances van het onderwerp


Verhaal Het team verwarde de concepten van een stringarray en een pointer naar een literal. Een functie nam char *output = "default"; en voerde vervolgens strcpy(output, input); uit, wat resulteerde in een crash bij de eerste uitvoering omdat de kopie in read-only geheugen plaatsvond.


Verhaal Bij netwerkwerkzaamheden werd het resultaat in een buffer geschreven die was gereserveerd met char *buf = NULL; strcpy(buf, data);. Dit leidde tot schrijven in niet-geinitialiseerd geheugen en een crash van de applicatie.


Verhaal In een lokalisatiepakket gaf het team strings door tussen componenten zonder te controleren of het \0-kenmerk was toegevoegd. Een keer produceerde de functie rommel op de console en beschadigde de interne geheugenstructuur.