“Abort trap: 6” fout in C?

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 greetingniet 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 greetingwordt 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 greetingeen array van charmet een grootte van 6 (omdat helloen \0).

Dus als je strcpy(greeting, "greetings, ");gebruikt om "greetings, "naar greetingte kopiëren, kan dat niet. Omdat greetingniet genoeg is om een array met 11+1-teken

te bevatten

=> Heeft fout abort trap : 6hier

Other episodes