После написания программы для реверсирования строки у меня возникли проблемы с пониманием того, почему я получил ошибку seg при попытке реверсировать строку. Я перечислил свою программу ниже.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *);
int main() {
char *str = calloc(1,'\0');
strcpy(str,"mystring0123456789");
reverse(str);
printf("Reverse String is: %s\n",str);
return 0;
}
void reverse(char *string) {
char ch, *start, *end;
int c=0;
int length = strlen(string);
start = string;
end = string;
while (c < length-1){
end++;
c++;
}
c=0;
while(c < length/2){
ch = *end;
*end = *start;
*start = ch;
start++;
end--;
c++;
}
}
1-й вопрос:
Несмотря на то, что я выделил только 1 байт памяти для указателя char str (calloc(1,'\0')
) и скопировал в него 18-байтовую строку mystring0123456789
, и это не выдало никакой ошибки, и программа работала нормально без каких-либо SEGFAULT.
Почему моя программа не выдавала ошибку? В идеале он должен выдать какую-то ошибку, поскольку у него нет памяти для хранения этой большой строки. Может ли кто-нибудь пролить свет на это?
Программа работала отлично и выдает результат Reverse String is: 9876543210gnirtsym
.
2-й вопрос:
Если заменить оператор
strcpy(str,"mystring0123456789");
с
str="mystring0123456789\0";
программа выдает ошибку сегментации, хотя я выделил достаточно памяти для str (malloc(100)
).
Почему программа выдает ошибку сегментации?