|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как скопировать участок памяти |
|
C/C++ - Как скопировать участок памяти
|
Новый участник Сообщения: 49 |
Как скопировать данные с некоторого участка памяти, занятого например массивом? По типу memcpy. Но дело в том что мемцпу работает со статической памятьтю. А если память выделена в куче, то как быть? В таком случае не работает ни sizeof, ни memcpy. Такое происходит, вероятно, потому - что этим функциям, в случае с динамическим массиврм, приходится передавать указатель, кот-ый содержит адрес по которому расположен массив, а не сам адрес. Может можно что-то придумать?
Просто в падлу копировать каждый раз, каждый элемент структуры отдельно. Это слишком скурпулезно. |
|
Отправлено: 09:53, 15-11-2008 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Сейчас практически во всех доступных простому смертному системах память линейная и однородная. С точки зрения копирования разницы между статической и динамической памятью нет. Компилятор автоматически перетранслирует имя массива и указатель в адрес, в этом смысле код
char mem1[10]; char mem2[20]; memcpy(mem1, mem2, 10); // делает то же что char* mem3 = mem1; memcpy(mem1, mem3, 10); // точно так же (тем же способом) как char* mem4 = new char(10); char* mem5 = new char(20); memcpy(mem4, mem5, 10); std::string mem1[10]; mem1[0] = "str1"; std::string mem2[20]; memcpy(mem1, mem2, sizeof(std::string)*10); // строка состоит из указателя на память и дополнительных данных. // При копировании мы сдублировали указатель, но не привели в соотвествие другие данные, // например счётчик ссылок. Поэтому при удалении mem1 или mem2 мы рушим динамическую память std::copy(&mem1[0], &mem1[10], &mem2[0]); // теперь используется std::string::operator=(const std::string&), который всё приведёт в соответсвие // при таком споосбе память останется невредимой // чтобы не копировать каждый отдельно: struct st1 { std::string s1; std::vector<int> v1; int s2; AnsiString as1; }; st1 mem1, mem2; // "муторно" копируем mem1 = mem2; |
Отправлено: 12:57, 16-11-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 49
|
Профиль | Отправить PM | Цитировать Цитата pva:
Цитата pva:
Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива. Цитата pva:
. |
|||
Отправлено: 14:31, 16-11-2008 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата ___oj:
Цитата ___oj:
Цитата ___oj:
|
|||
Отправлено: 19:05, 16-11-2008 | #4 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как полностью скопировать юзера ? | mitiya | Microsoft Windows NT/2000/2003 | 3 | 14-10-2008 10:13 | |
Как скопировать нефинализированный DVD? | ЮЮА | Видео и аудио: обработка и кодирование | 15 | 05-04-2008 22:31 | |
Как правильно скопировать профиль? | Ferum01 | Microsoft Windows NT/2000/2003 | 7 | 07-09-2007 10:17 | |
Как скопировать входящих пользователей диалапа | Shaytan | Microsoft Windows 2000/XP | 0 | 30-03-2007 10:45 | |
как скопировать сайт? | Millenium | Вебмастеру | 12 | 25-06-2005 20:36 |
|