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

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

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

Функция memcpy копирует size байт из объекта, начинающегося в from в объект, начинающийся в to. Поведение этой функции неопределено если два массива перекрываются
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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)
Все компилирует и работает, но выдает такое сообщение.

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

8
Байт
Эксперт C
20458 / 12986 / 2730
Регистрация: 24.12.2010
Сообщений: 27,180
09.07.2017, 11:01 2
C
1
2
3
 char s[10];
char *p = s+2;
memcpy(s, p, 8); // UB
1
malloy
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 21
09.07.2017, 11:44  [ТС] 3
я не ппонял, область памяти одного массива является оластью памяти другого?
0
Байт
Эксперт C
20458 / 12986 / 2730
Регистрация: 24.12.2010
Сообщений: 27,180
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
09.07.2017, 12:05
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
09.07.2017, 13:50 5
Цитата Сообщение от Байт Посмотреть сообщение
Лучше применить другую функцию.
memmove() как-раз для таких случаев.
2
Байт
Эксперт C
20458 / 12986 / 2730
Регистрация: 24.12.2010
Сообщений: 27,180
09.07.2017, 14:51 6
Цитата Сообщение от easybudda Посмотреть сообщение
memmove() как-раз для таких случаев.
Да, правильно. Справочника под рукой не было, а гуглить - в лом.
А эта функция, кажется, соображает, с какой стороны начинать перестановку байтиков.
1
malloy
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 21
09.07.2017, 15:00  [ТС] 7
а каким вы пользуетесь справочником, если не секрет
я использую http://www.cplusplus.com, но тут не все функции
ну и может быть вы знаете справочник по api linux))))
0
Байт
Эксперт C
20458 / 12986 / 2730
Регистрация: 24.12.2010
Сообщений: 27,180
09.07.2017, 15:26 8
Цитата Сообщение от malloy Посмотреть сообщение
каким вы пользуетесь справочником, если не секрет
Боюсь, что мой справочник вам не подойдет. Он издания прошлого века, тираж 800 экземпляров, библиографическая редкость И многое, конечно, устарело, да и открываю я его не часто, и затрепан он невообразимо. Но перед вами - весь Интернет!
1
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
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
09.07.2017, 17:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2017, 17:00

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

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

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


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

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

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