![]() |
|
Модераторы: bsa |
![]()
|
|
| Syltan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
Попробовал потренироватся, как работает функция мемсет.
Вот попробовал самый простенький код, но не выдаёт результат 7, хотя все поля инициализированны этой функцией семёрками. Вот исходник:
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Syltan, 7 - это int. т.е. == 4 байта.
а sizeof(A) == 12 байтам. мысль улавливаешь? Добавлено через 2 минуты и 13 секунд а вообще, memset() можно применять только к POD типам. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Syltan, к классам memset нужно применять с большой осторожностью. Только в случае если ни у одного из предков не было виртуальных методов и у самого класса тоже. memset(&r,7,sizeof(A)); сработает правильно. Если просмотреть под дебагом память начиная с адреса объекта, то там действительно будут семерки в каждом байте.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Syltan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
То есть в основном их нужно применять к структурам?
Вот попробовал, ну структура выдаёт тоже не 7.
Результат: 117901063 117901063 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
В С++ структура почти тоже что и класс. в переменной a будет 0x07070707 = 117901063 тоже в b, а в c даже посчитать трудно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Syltan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
Хорошо, скажите в двух словах, какой смысл от memset?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
В основном используется для зануления (реже заполнения другими одинаковыми БАЙТАМИ) буферов (непрерывных массивов простейших типов, например char или int).
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Ну нулями можно заполнить. Если массив байтов, или символов то можно заполнить чем-то иным отличным от нуля. Вообще, с точки зрения безопасности полезно объект/структуру без VMT занулять. В некоторых случаях это позволяет избежать утечек памяти. Поля указатели обязательно должны зануляться. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Syltan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
Для зануления полей в структуре, то ест ьинициализацией кадого поля значением ноль? Это сообщение отредактировал(а) Syltan - 24.2.2010, 00:24 |
|||
|
||||
| Sosed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 18.8.2009 Репутация: 1 Всего: 1 |
Был интересный пример с memset, применяли для сравнения структур, данные ведь располагаются не последовательно, отсюда просто сравнить(==) 2 структуры не получается, помогаем мемсетом:
Если надо сравнить используем memcmp(&a1, &a2, sizeof(a1)); Это сообщение отредактировал(а) Sosed - 24.2.2010, 01:10 |
|||
|
||||
| Syltan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
Прочитал вот такое:
Заполняется память а1 значением ноль? Ещё вопрос зачем выделять память sizeof? Это сообщение отредактировал(а) Syltan - 24.2.2010, 01:48 |
||||
|
|||||
| Sosed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 18.8.2009 Репутация: 1 Всего: 1 |
sizeof размер возвращает
Посмотри размер структуры a1, а потом всех составляющих ее переменных. Различаться будут, значит левые байты есть. Если их не занулить, то неизвестно что там будет, и сравнить не получится. |
|||
|
||||
| lBugl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 18.8.2009 Репутация: 1 Всего: 2 |
угу. memset(&a1, 0, sizeof(a)); memset это не присваивание объекту или типу значения (к этим словам не придирайтесь =) ). Она записывает в адрес в памяти (1-й параметр) значение (2-й параметр) и продолжает идти по памяти и заполнять её (сколько? 3-й параметр).... примерно так что ли... =) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
На самом деле последовательно, в том смысле что следуют друг за другом в том порядке, в котором их объявили, просто между полями возможны "окна" не несущие ни какой информации. Если объект занулить по полям, то "окна" все равно сохраняют не инициоализированое значения, поэтому побайтовое сравнение одинаковых объектов может не получиться, ведь в окнах остались произвольные значения. Если объект занулить мемсетом, то зануляются и окна, так что становиться возможным проводить побайтовое сравнение. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Syltan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 301 Регистрация: 31.8.2009 Репутация: -1 Всего: -2 |
Растолкуйте, а то как-то умно написано. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |