C — функция memmove () — сколько байтов я перемещаю в этой реализации?

Кажется, это отличное место. Мой вопрос в том, какое значение (или сколько байтов) я перемещаю в этой реализации memmove()?

int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+15,str+20,/*?*/);
puts (str);
return 0;
}

В следующем примере говорится, что я перемещаю 11 байт. Но что делает его 11 байт? Может кто-нибудь объяснить?

int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11); //source and destination are reversed
puts (str);
return 0;
}

Спасибо!

Редактировать: Кстати, длина строки составляет 33, включая завершающий нулевой символ.


person Mike mmm    schedule 29.10.2011    source источник
comment
int main() должно быть int main(void). Что еще более важно, вам нужны #include <stdio.h> и #include <string.h>. Если ваш компилятор не предупредил вас об этом, поднимите уровень предупреждения, пока он не предупредит.   -  person Keith Thompson    schedule 29.10.2011
comment
То, что вы нам показываете, не является реализацией memmove(), это просто программа, которая вызывает memmove(). Реализация memmove() будет кодом в библиотеке времени выполнения, который фактически копирует байты.   -  person Keith Thompson    schedule 29.10.2011
comment
11 делает его 11 байт. Дух. В первом примере вы ничего не перемещаете, пока не поставите число вместо /*?*/. Вы путаете memmove с strcpy?   -  person Jim Rhodes    schedule 29.10.2011


Ответы (3)


Третий параметр memmove указывает количество байтов для перемещения, поэтому во втором примере вы перемещаете 11 байтов. Ваш первый пример не должен компилироваться, потому что у вас будет синтаксическая ошибка в строке, вызывающей memmove.

person David Grayson    schedule 29.10.2011

Последним аргументом функции memmove() является количество байтов для перемещения, в данном случае 11.

person Martin Beckett    schedule 29.10.2011
comment
@Keith Thompson Знаете ли вы, сколько байтов должно быть в первом примере? - person Mike mmm; 30.10.2011
comment
@Mikemmm: Что ты пытаешься сделать? - person Keith Thompson; 30.10.2011
comment
@Keith Thompson Я пытаюсь сдвинуть элементы массива влево, перезаписывая начальный элемент правым, а затем всеми элементами справа от него. Вроде удаления из очереди. - person Mike mmm; 30.10.2011

Третий параметр определяет, сколько байт копировать; в первом примере вы должны указать, сколько байт копировать.

person Suroot    schedule 29.10.2011
comment
Неправильно. str+15 совпадает с &str[15]; оба выражения имеют тип char*. - person Keith Thompson; 29.10.2011
comment
Я удалил свое отрицательное мнение после редактирования (хотя это все еще избыточно с другими ответами). - person Keith Thompson; 29.10.2011