Прервать вместо segfault с явным нарушением памяти

Я столкнулся с этим странным поведением при работе со строками Си. Это упражнение из книги K & R, где я должен был написать функцию, которая добавляет одну строку в конец другой строки. Это, очевидно, требует, чтобы для строки назначения было выделено достаточно памяти, чтобы соответствовать исходной строке. Вот код:

 /* 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;
}

Во время тестирования я написал следующее, ожидая, что во время работы программы произойдет сбой:

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

Насколько я понимаю, s1 получает массив из 6chars выделил и s2 массив из 13chars, Я думал, что когдаstrcat пытается записать в s1 при индексах выше 6 программа будет segfault. Вместо этого все работает нормально, но программа не выходит чисто, вместо этого:

helloeheheheheheh
zsh: abort      ./a.out

и выходит с кодом 134, который, я думаю, означает просто прервать.

Почему я не получаю segfault (или перезаписываю s2, если строки расположены в стеке)? Где эти строки в памяти (стек или куча)?

Спасибо за вашу помощь.

Ответы на вопрос(6)

Ваш ответ на вопрос