Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: memcpy  (Прочитано 8551 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 18-05-2012 21:57 » 

Что-то жёстко туплю :

Код:
len = (wcslen(L"Test") + 1)*sizeof(WCHAR);
fulllen = len + 5;
pinfo = malloc(fulllen);
if(pinfo)
{
    memset(pinfo,0,fulllen);

  [b] memcpy(pinfo,L"Test",fulllen); // <-почему здесь не падает?[/b]
}
Как вообще работает memcpy ()? - L"Test" - занимает 8 байт в памяти,а я пытаюсь записать 8 + 5 байт,почему не происходит ACCESS_READ VIOLATION при чтении из L"Test"?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-05-2012 22:57 » 

AlexCasual, потому что ничего не повреждается. А зачем всем этим заниматься?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #2 : 19-05-2012 12:45 » 

AlexCasual, memcpy() не обязательно должен падать - если страница оказывается целиком в памяти, то падать не будет.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-05-2012 21:37 » 

Страница не бывает "нецеликом" в памяти. Она либо в памяти, либо нет. Но memcpy даже не подумает падать если страницы нет в памяти, она об этом просто не узнает. Страницу подгрузят. Упадёт она только в том случае, если прочитает от туда, откуда читать нельзя, или запишет туда, куда нельзя записывать.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #4 : 22-05-2012 05:49 » 

Страница не бывает "нецеликом" в памяти. Она либо в памяти, либо нет. Но memcpy даже не подумает падать если страницы нет в памяти, она об этом просто не узнает. Страницу подгрузят. Упадёт она только в том случае, если прочитает от туда, откуда читать нельзя, или запишет туда, куда нельзя записывать.
Вы правы, я не совсем корректно выразился, я имел в виду буфер целиком в распределённой процессу памяти, если размер записываемого буфера поместится в распределённой процессу памяти - то не упадёт, а, возможно, попортит какие-нибудь соседние данные, оказавшиеся за исходным буфером, если не поместится - то упадёт, т.к. страницы, которую надо было-бы подгрузить в адресном пространстве процесса нет.
Записан
zubr
Гость
« Ответ #5 : 22-05-2012 07:15 » 

darkelf, если говорить о примере топикстартера, то попортить соседние данные никак не получится, так как запись как раз по размеру корректна, размер буфера для чтения не корректен. Падение, касаемо примера также маловероятно. Падение в данном случае возможно, если размер запрашиваемого буфера будет превышать размер страницы в памяти и следующая страница будет иметь атрибут, запрещающий чтение.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-05-2012 19:51 » 

zubr, или если память под следующую виртуальную страницу не выделена.

Это как раз то, о чём нам весьма витиевато пытался сказать darkelf.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines