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.