Форум программистов, компьютерный форум CyberForum.ru

memset, memcpy - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 03:21     memset, memcpy #1
Использую MSVS 2008.

Почему memcpy работает только с char?

То есть, такой код работает:
C++
1
2
3
4
5
6
7
8
9
int main() {
    char a1 [] = "123";
    char a2 [4];
 
    memcpy(a2, a1, 4);
 
    for(int i = 0; i < 3; i++)
        std::cout << a2 [i] << " ";
}
А такой нет:
C++
1
2
3
4
5
6
7
8
9
int main() {
    int a1 [] = {1, 2, 3};
    int a2 [3];
 
    memcpy(a2, a1, 3);
 
    for(int i = 0; i < 3; i++)
        std::cout << a2 [i] << " ";
}
Так же и у функций memset - с char работает, а с другими типами - нет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 03:21     memset, memcpy
Посмотрите здесь:

memset C++
C++ memset()
Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy C++
Что делает memset в приведенном коде C++
C++ Порядок хранения структур в ОЗУ и memset
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.09.2011, 03:32     memset, memcpy #2
http://www.cplusplus.com/reference/c...string/memcpy/
читаем до просветления
C
1
void * memcpy ( void * destination, const void * source, size_t num );
...
Parameters
destination
Pointer to the destination array where the content is to be copied, type-casted to a pointer of type void*.
source
Pointer to the source of data to be copied, type-casted to a pointer of type void*.
num
Number of bytes to copy.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 04:18  [ТС]     memset, memcpy #3
Спасибо! Сразу не заметил.
Байт
 Аватар для Байт
13989 / 8820 / 1231
Регистрация: 24.12.2010
Сообщений: 15,978
11.09.2011, 08:03     memset, memcpy #4
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Использую MSVS 2008.

Почему memcpy работает только с char?

А такой нет:
C++
1
2
3
4
5
6
7
8
9
int main() {
    int a1 [] = {1, 2, 3};
    int a2 [3];
 
    memcpy(a2, a1, 3);
 
    for(int i = 0; i < 3; i++)
        std::cout << a2 [i] << " ";
}
Так же и у функций memset - с char работает, а с другими типами - нет.
Ну, если уж очень хочется, можно так
C
1
2
3
int a1 [] = {1, 2, 3};
int a2 [3];
memcpy(a2, a1, 3*sizeof(int));
Но рекомендовать такой подход ни в коем случае не могу
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 12:24  [ТС]     memset, memcpy #5
Цитата Сообщение от Байт Посмотреть сообщение
Ну, если уж очень хочется, можно так
C
1
2
3
int a1 [] = {1, 2, 3};
int a2 [3];
memcpy(a2, a1, 3*sizeof(int));
Но рекомендовать такой подход ни в коем случае не могу
А почему рекомендовать не можете? Если 3-й параметр не первышает допустимого значения, то я в этой функции ничего плохого не вижу.
-=ЮрА=-
Заблокирован
Автор FAQ
11.09.2011, 13:35     memset, memcpy #6
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
int main() {
* * * * char a1 [] = "123";
* * * * char a2 [4];
memcpy(a2, a1, 4);
for(int i = 0; i < 3; i++)
* * * * * * * * std::cout << a2 [i] << " ";
}
memcpy(move,set) в качестве своих параметров принимают адреса блоков памяти, и в них при желании можно всё запихнуть, не забывая при этом вбить (void *) перед параметром

Цитата Сообщение от Байт Посмотреть сообщение
Но рекомендовать такой подход ни в коем случае не могу
- думаю в случае статических массивов он просто не работает(покрайней мере на старых версиях), мой компилятор выдал не могу преобразовать int *()(3) в (void *)

Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
int a1 [] = {1, 2, 3};
int a2 [3];
memcpy(a2, a1, 3*sizeof(int));
- на сие мой старенький компилятор кричал что не может выполнить преобразование в (void *), думаю правельней будет вот так писать
C++
1
memcpy((void *)&a2[0], (void *)&a1[0], 3*sizeof(int));
Вот здесь нормально о memcpy написано http://www.cplusplus.com/reference/c...string/memcpy/
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.09.2011, 13:39     memset, memcpy #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю правельней будет вот так писать
для ++, си же пофигу
Байт
 Аватар для Байт
13989 / 8820 / 1231
Регистрация: 24.12.2010
Сообщений: 15,978
11.09.2011, 14:09     memset, memcpy #8
-=ЮрА=-, конструкции &a[0] и a совершенно эквивалентны.
Так что можно писать
C
1
memcpy((void *)a2, (void *)a1, ...);
А насчет компиляторов ты прав. Многие на отсутствие приведения (void *) капризничают
Берегут нашего брата, непутевого программиста
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
11.09.2011, 15:56     memset, memcpy #9
Цитата Сообщение от Байт Посмотреть сообщение
конструкции &a[0] и a совершенно эквивалентны.
Нет. У них разные типы. Хотя во многих случаях тип второго может неявно преобразовываться в тип первого.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.09.2011, 16:00     memset, memcpy #10
Цитата Сообщение от Байт Посмотреть сообщение
А насчет компиляторов ты прав. Многие на отсутствие приведения (void *) капризничают
Это в С++ приведение указателя к void* и обратно работать не будет, в С пограммах без сучка/задоринки. Но к слову в программах на С++ вообще функции С лучше без крайней нужды не использовать, а уж те, что для работы с памятью - особенно. На POD типах оно может и отработает, а вот с объектами произвольного класса - беда. Вот не знает memcpy() про конструкторы, деструкторы и прочие прелести ООП...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 16:28     memset, memcpy
Еще ссылки по теме:

Запустить программу. Библиотека для memset C++
2d ---> 1d array и memcpy C++
C++ Memset для двухмерного массива

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

Или воспользуйтесь поиском по форуму:
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 16:28  [ТС]     memset, memcpy #11
easybudda, зато эти функции работают быстрее, особенно с большим количеством данных. Хотя с точки зрения безопасности их лучше остерегаться.
Yandex
Объявления
11.09.2011, 16:28     memset, memcpy
Ответ Создать тему
Опции темы

Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru