Прервать вместо 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, если строки расположены в стеке)? Где эти строки в памяти (стек или куча)?
Спасибо за вашу помощь.