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
const is).Om fouten te vermijden:
malloc, strcpy, controleer de buffer-grootte).\0.Voorbeeld van correcte stringverwerking:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer is wijzigbaar en bevat gegarandeerd '\0'
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.
Verhaal Het team verwarde de concepten van een stringarray en een pointer naar een literal. Een functie nam
char *output = "default";en voerde vervolgensstrcpy(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.