Ошибка сегментации во время memcpy
Я пытаюсь сделать функцию, которая меняет порядок части строки. Я новичок в использовании указателей, и по какой-то причине я могу получить доступ к расположению символов моей строки, чтобы скопировать подстроку, но я не могу вернуть их в то же место...
Когда я пытаюсь скопировать обратную подстроку обратно в исходное местоположение, я получаю
Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x00007ffff7b5dc66 в?? () из /lib/x86_64-linux-gnu/libc.so.6
Любая помощь будет потрясающей!
Вот что у меня так далеко:
void reverse(char* line, int start, int end){
char str[end-start];
memcpy ( str , line + start , end-start );
reverseSubString ( str );
memcpy ( line + start, str , end-start );
}
void reverseSubString(char* str){
int i, j, len;
char temp;
i=j=len=temp=0;
len=strlen(str);
for (i=0, j=len-1; i<=j; i++, j--)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
2 ответа
char str[end-start];
memcpy ( str , line + start , end-start );
Если 0-терминатор исходной строки не включен, у вас есть char
массив, который не заканчивается 0. Так
len=strlen(str);
вычисляет кто знает что, если это не произойдет. затем
for (i=0, j=len-1; i<=j; i++, j--)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
доступ за пределы выделенной памяти.
reverseSubstring()
ожидает N-концевую строку C, потому что она вызывает strlen()
в передаваемой строке. Однако вам не удается завершить NUL-строку в reverse
функция. Либо сделать это, или даже лучше, передать в length
аргумент:
void reverseSubString(char *str, size_t len)
{
int i, j;
char temp;
for (i = 0, j = len - 1; i <= j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
void reverse(char *line, int start, int end)
{
char str[end - start];
memcpy(str, line + start, end - start);
reverseSubString(str, end - start);
memcpy (line + start, str, end - start);
}