146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
1

memset, memcpy

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

Author24 — интернет-сервис помощи студентам
Использую 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 работает, а с другими типами - нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2011, 03:21
Ответы с готовыми решениями:

Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy
Бывает ли на практике такое, что код #define size 1000; // some value int x, y; /* ... */...

memset()
Здравсвуйте. У меня возник вопрос касательно memset().Есть код: #include &lt;iostream&gt; #include...

memset
Попробовал потренироватся, как работает функция мемсет. Вот попробовал самый простенький код, но...

по поводу memset
здравствуйте, есть, допустим, такой код(rtti включен): struct img { virtual void a() = 0; };...

10
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.09.2011, 03:32 2
http://www.cplusplus.com/refer... ng/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.
2
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 04:18  [ТС] 3
Спасибо! Сразу не заметил.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
11.09.2011, 08:03 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));
Но рекомендовать такой подход ни в коем случае не могу
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 12:24  [ТС] 5
Цитата Сообщение от Байт Посмотреть сообщение
Ну, если уж очень хочется, можно так
C
1
2
3
int a1 [] = {1, 2, 3};
int a2 [3];
memcpy(a2, a1, 3*sizeof(int));
Но рекомендовать такой подход ни в коем случае не могу
А почему рекомендовать не можете? Если 3-й параметр не первышает допустимого значения, то я в этой функции ничего плохого не вижу.
0
Заблокирован
Автор FAQ
11.09.2011, 13:35 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/refer... ng/memcpy/
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.09.2011, 13:39 7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю правельней будет вот так писать
для ++, си же пофигу
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
11.09.2011, 14:09 8
-=ЮрА=-, конструкции &a[0] и a совершенно эквивалентны.
Так что можно писать
C
1
memcpy((void *)a2, (void *)a1, ...);
А насчет компиляторов ты прав. Многие на отсутствие приведения (void *) капризничают
Берегут нашего брата, непутевого программиста
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.09.2011, 15:56 9
Цитата Сообщение от Байт Посмотреть сообщение
конструкции &a[0] и a совершенно эквивалентны.
Нет. У них разные типы. Хотя во многих случаях тип второго может неявно преобразовываться в тип первого.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
11.09.2011, 16:00 10
Цитата Сообщение от Байт Посмотреть сообщение
А насчет компиляторов ты прав. Многие на отсутствие приведения (void *) капризничают
Это в С++ приведение указателя к void* и обратно работать не будет, в С пограммах без сучка/задоринки. Но к слову в программах на С++ вообще функции С лучше без крайней нужды не использовать, а уж те, что для работы с памятью - особенно. На POD типах оно может и отработает, а вот с объектами произвольного класса - беда. Вот не знает memcpy() про конструкторы, деструкторы и прочие прелести ООП...
2
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 16:28  [ТС] 11
easybudda, зато эти функции работают быстрее, особенно с большим количеством данных. Хотя с точки зрения безопасности их лучше остерегаться.
0
11.09.2011, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2011, 16:28
Помогаю со студенческими работами здесь

Неправильное использование memset
сам столкнулся как-то с такой вещью как неправильное использование memset на чистом си... до этого...

Memset для двухмерного массива
int g_iArray; memset( g_iArray, 0, sizeof( g_iArray) ); Верно ли ?

Что делает memset в приведенном коде
void replace(char* text, char* word) { char* buffer = new char; strcpy(buffer, text); int...

Порядок хранения структур в ОЗУ и memset
Всем добра! Вопрос в следующем. если объявить массив например m - то он будет храниться в ОЗУ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru