Ik ben een beginner in C, maar ik heb deze code op xcode draaien via gcc op terminal:
#include <stdio.h>
#include <string.h>
int main(){
char name[12] = "Roman Mirov";
printf("My name is %s\n", name);
name[8] = 'k';
printf("My name is %s\n", name);
char greeting[] = "hello";
printf("%s %s\n", greeting, name);
strcpy(greeting, "greetings, ");
printf("%s%s\n", greeting, name);
return 0;
}
En het geeft dit weer:
My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6
Mijn vraag is precies, waarom genereert het een fout in plaats van de laatste regel als output “groeten, Roman Mikov” te tonen?
Antwoord 1, autoriteit 100%
In dit geval heeft de bestemming greeting
niet genoeg ruimte om de volledige inhoud van bronte bevatten, dus het is een toegang buiten de grenzen die ongedefinieerd gedrag.
Om uit te leggen, de grootte van array greeting
wordt bepaald door de grootte van de meegeleverde initializer,
char greeting[] = "hello";
in dit geval "hello"
wat de grootte op 6 maakt, inclusief de nul-terminator.
Nu probeer je later een veel grotere stringin het geheugen te stoppen,
strcpy(greeting, "greetings, ");
waarbij de bron 12 bytes groot is, terwijl de bestemming er slechts 6 bevat. Dit veroorzaakt de grensoverschrijding en het resultaat, UB. De crash (of afbreken) is een van de mogelijke bijwerkingen van UB.
Antwoord 2
In deze regel wijst u een array van 5+1 tekens toe:
char greeting[] = "hello";
In deze regel probeert u 11+1 tekens in die array te schrijven:
strcpy(greeting, "greetings, ");
Antwoord 3
In dit geval is de variabele greeting
een array van char
met een grootte van 6 (omdat hello
en \0
).
Dus als je strcpy(greeting, "greetings, ");
gebruikt om "greetings, "
naar greeting
te kopiëren, kan dat niet. Omdat greeting
niet genoeg is om een array met 11+1
-teken
te bevatten
=> Heeft fout abort trap : 6
hier