Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Перемещение содержимого памяти



Для перемещения блока байтов из одной области памяти в другую заголовочный файл МЕМ.Н объявляет две функции, связанные с этой операцией: memmove() и memcpy(). Обе они продемонстрированы в лис­тинге 6.12. В данной программе операции по перемещению блоков памяти использованы для вставки под­строки в другую строку.

Листинг 6.12. MEMMOVE.C (вставка подстроки в строку)

1: #include <stdio.h>

2: #include <string.h>

3: #include <mem.h>

4:

5: main()

6: {

7: char original[128] = "How now cow?";

8: char insert[] = " brown";

9: char *p;

10: int len;

11:

12: printf("0riginal string == %s\n", original);

13: printf("Insert string == %s\n", insert);

14: len = strlen(insert);

15: p = strrchr(original, ' '); /* Найти последний пробел */

16: memmove(p + len, p, len); /* Вырезать "дыру" в строке */

17: memcpy(p, insert, len); /* Сделать вставку в дыру */

18: printf("Final string == %s\n", original);

19: return 0;

20: }

______________________________________________________

В строке 7 объявляется исходная строка, в которой все слова рифмуются и в которой, очевидно, что-то пропущено. Пропущенное слово записывается в символьный массив insert в строке 8. Чтобы вставить слово в строку, выполняется вызов функции memmove() (строка 16). Ее первым аргументом является адрес области, в которую вы хотите переместить какое-то количество байтов. Второй аргумент - это адрес перемещаемых байтов. Третий (он же последний) аргумент представляет число перемещаемых байтов. Оператор в строке 16 проделывает "дыру" в исходной строке размером с пропущенное слово.

В следующей строке вызывается функция memcpy() для того, чтобы опустить пропущенное слово в подготовленную дыру в исходной строке. Аргументы этой функции аналогичны аргументам функции memmove(). В дан­ном случае указатель р адресует область назначения (начало дыры, проделанной в строке 16). Аргумент insert является адресом источника - вставляемой строки. Число байтов представлено переменной len.

Упомянутые две функции memmove() и memcpy() выполняют аналогичную работу, но имеют небольшое различие.

• Функция memmove() может копировать блок памяти в другую область, даже когда один или несколько байтов в двух областях перекрываются.

• Функция memcpy() также может копировать блок памяти в другую область, но два блока не должны пере­крываться. Другими словами, если какой-нибудь из адресов блока назначения попадает внутрь области блока источника, то результат вызова функции memcpy() не определен.

Замечание

Если вы не можете определить заранее, имеют ли два блока перекрывающиеся адреса. То, чтобы скопировать один блок в другой, используйте более безопасную функцию memmove





Дата публикования: 2015-01-23; Прочитано: 160 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...