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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
#1

memset, memcpy - C++

11.09.2011, 03:21. Просмотров 2531. Ответов 10
Метки нет (Все метки)

Использую 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 работает, а с другими типами - нет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 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
Спасибо! Сразу не заметил.
Байт
Эксперт C
 Аватар для Байт
15043 / 9445 / 1383
Регистрация: 24.12.2010
Сообщений: 17,482
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
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю правельней будет вот так писать
для ++, си же пофигу
Байт
Эксперт C
 Аватар для Байт
15043 / 9445 / 1383
Регистрация: 24.12.2010
Сообщений: 17,482
11.09.2011, 14:09     memset, memcpy #8
-=ЮрА=-, конструкции &a[0] и a совершенно эквивалентны.
Так что можно писать
C
1
memcpy((void *)a2, (void *)a1, ...);
А насчет компиляторов ты прав. Многие на отсутствие приведения (void *) капризничают
Берегут нашего брата, непутевого программиста
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
11.09.2011, 15:56     memset, memcpy #9
Цитата Сообщение от Байт Посмотреть сообщение
конструкции &a[0] и a совершенно эквивалентны.
Нет. У них разные типы. Хотя во многих случаях тип второго может неявно преобразовываться в тип первого.
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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
Еще ссылки по теме:

C++ Memset для двухмерного массива
Memcpy и динамические массивы C++
C++ Работа функции memcpy
C++ по поводу memset
C++ Не работает memcpy

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

Или воспользуйтесь поиском по форуму:
.::.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
Ответ Создать тему
Опции темы

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