Przerwij zamiast segfault z wyraźnym naruszeniem pamięci

Zetknąłem się z tym dziwnym zachowaniem, gdy miałem do czynienia z ciągami C Jest to ćwiczenie z książki K&R, w którym miałem napisać funkcję, która dołącza jeden ciąg na końcu innego ciągu. Wymaga to oczywiście, aby ciąg docelowy miał wystarczającą ilość pamięci, aby pasował do łańcucha źródłowego. Oto kod:

 /* strcat: Copies contents of source at the end of dest */
 char *strcat(char *dest, const char* source) {
  char *d = dest;
  // Move to the end of dest
  while (*dest != '\0') {
    dest++;
  } // *dest is now '\0'

  while (*source != '\0') {
    *dest++ = *source++;
  }
  *dest = '\0';
  return d;
}

Podczas testowania napisałem następujące informacje, spodziewając się wystąpienia segfaultu podczas działania programu:

int main() {
  char s1[] = "hello";
  char s2[] = "eheheheheheh"; 
  printf("%s\n", strcat(s1, s2));
}

O ile rozumiem, s1 otrzymuje tablicę 6chars przydzielone i s2 tablica 13chars. Myślałem, że kiedystrcat próbuje napisać do s1 przy indeksach wyższych niż 6 program ulegnie segregacji. Zamiast tego wszystko działa dobrze, ale program nie wychodzi bez zarzutu, zamiast tego:

helloeheheheheheh
zsh: abort      ./a.out

i wychodzi z kodem 134, który moim zdaniem oznacza przerwanie.

Dlaczego nie otrzymuję segfaultu (lub nadpisywania s2, jeśli łańcuchy są przydzielane na stosie)? Gdzie są te ciągi w pamięci (stos lub sterty)?

Dzięki za pomoc.

questionAnswers(6)

yourAnswerToTheQuestion