Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 21
1

Что значит "массивы перекрываются" (функция memcpy)?

09.07.2017, 10:40. Просмотров 1492. Ответов 8
Метки нет (Все метки)

Функция memcpy копирует size байт из объекта, начинающегося в from в объект, начинающийся в to. Поведение этой функции неопределено если два массива перекрываются
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2017, 10:40
Ответы с готовыми решениями:

что значит "передать в виде образа оперативной памяти"
ребят, помогите, очень нужно. есть задание и есть код, нужно чуть чуть подправить, я не понимаю...

Что значит "создать массив структур в автоматической памяти"?
Автоматическая память это стек? struct student s ; А как потом создать переменную структуры? Я...

Что значит 3d вот здесь printf ("%3d", *(x+i);--?
printf ("%.2f", *(x+i));- здесь я знаю. Два знака после запятой при типах float и double. А,...

Что значит "Implicit conversion loses integer precision"? (работаю через Xcode)
Все компилирует и работает, но выдает такое сообщение.

8
Эксперт C
23466 / 14708 / 3096
Регистрация: 24.12.2010
Сообщений: 31,372
09.07.2017, 11:01 2
C
1
2
3
 char s[10];
char *p = s+2;
memcpy(s, p, 8); // UB
1
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 21
09.07.2017, 11:44  [ТС] 3
я не ппонял, область памяти одного массива является оластью памяти другого?
0
Эксперт C
23466 / 14708 / 3096
Регистрация: 24.12.2010
Сообщений: 31,372
09.07.2017, 12:05 4
Лучший ответ Сообщение было отмечено malloy как решение

Решение

Цитата Сообщение от malloy Посмотреть сообщение
область памяти одного массива является оластью памяти другого?
ДА, именно так. Массив, на который ссылается указатель p, начинается со второго байта массива s. Ситуация вполне законная. И приведенный мной кусочек кода предназначен просто для сдвига на 2 байта влево.
C
1
2
3
4
 char s[10] = "123456789";
char *p = s+2;
memcpy(s, p, 8); // UB
printf("%s\n", s); // напечатает 3456789
Более того, обычно так оно и случится. Но стандарт этого не гарантирует (UB) Лучше применить другую функцию. Уточните по документации.
1
Модератор
Эксперт JavaЭксперт CЭксперт С++
10797 / 6539 / 1611
Регистрация: 25.07.2009
Сообщений: 12,314
09.07.2017, 13:50 5
Цитата Сообщение от Байт Посмотреть сообщение
Лучше применить другую функцию.
memmove() как-раз для таких случаев.
2
Эксперт C
23466 / 14708 / 3096
Регистрация: 24.12.2010
Сообщений: 31,372
09.07.2017, 14:51 6
Цитата Сообщение от easybudda Посмотреть сообщение
memmove() как-раз для таких случаев.
Да, правильно. Справочника под рукой не было, а гуглить - в лом.
А эта функция, кажется, соображает, с какой стороны начинать перестановку байтиков.
1
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 21
09.07.2017, 15:00  [ТС] 7
а каким вы пользуетесь справочником, если не секрет
я использую http://www.cplusplus.com, но тут не все функции
ну и может быть вы знаете справочник по api linux))))
0
Эксперт C
23466 / 14708 / 3096
Регистрация: 24.12.2010
Сообщений: 31,372
09.07.2017, 15:26 8
Цитата Сообщение от malloy Посмотреть сообщение
каким вы пользуетесь справочником, если не секрет
Боюсь, что мой справочник вам не подойдет. Он издания прошлого века, тираж 800 экземпляров, библиографическая редкость И многое, конечно, устарело, да и открываю я его не часто, и затрепан он невообразимо. Но перед вами - весь Интернет!
1
Модератор
Эксперт JavaЭксперт CЭксперт С++
10797 / 6539 / 1611
Регистрация: 25.07.2009
Сообщений: 12,314
09.07.2017, 17:00 9
Цитата Сообщение от Байт Посмотреть сообщение
А эта функция, кажется, соображает, с какой стороны начинать перестановку байтиков.
Смотрел пару разных её реализаций, обе промежуточный буфер создавали. Вот, почему, если области копирования не пересекаются, лучше использовать memcpy - быстрее, а если пересекаются - memmove.
Цитата Сообщение от malloy Посмотреть сообщение
я использую http://www.cplusplus.com, но тут не все функции
Стандартная библиотека там в полном составе, насколько помню. В UNIX подобных ОС есть команда man для вывода документации. Если не пользуетесь, есть в сети страницы руководства:
https://www.freebsd.org/cgi/man.cgi
https://linux.die.net/man/
Ну и для фанатов странных поделок от Майкрософт
https://msdn.microsoft.com/en-us/default.aspx
Там в принципе чего только нет, но искать привыкнуть надо...
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2017, 17:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'"
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем...

Что в Си значит "?"
что значит в си "?" ?

Что возвращает функция system("color")?
Хотелось бы узнать, почему: system("color"); возвращает 1, хотя в документации команды COLOR...

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена"
Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.