Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memset 
:(
    Опции темы
Syltan
Дата 23.2.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Попробовал потренироватся, как работает функция мемсет.
Вот попробовал самый простенький код, но не выдаёт результат 7, хотя все поля 
инициализированны этой функцией семёрками.
Вот исходник:
Код

#include <iostream>
using namespace std;
 
class A{
public:
        int a,b;
        float c;
};
 
int main()
{
A r;
memset(&r,7,sizeof(A));
cout<<r.a;
cin.get();
}
 

PM MAIL   Вверх
andrew_121
Дата 23.2.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Syltan, 7 - это int. т.е. == 4 байта.
а sizeof(A) == 12 байтам.
мысль улавливаешь?

Добавлено через 2 минуты и 13 секунд
а вообще, memset() можно применять только к POD типам.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Alexeis
Дата 23.2.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Syltan, к классам memset нужно применять с большой осторожностью. Только в случае если ни у одного из предков не было виртуальных методов и у самого класса тоже. memset(&r,7,sizeof(A)); сработает правильно. Если просмотреть под дебагом память начиная с адреса объекта, то там действительно будут семерки в каждом байте.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Syltan
Дата 23.2.2010, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



То есть в основном их нужно применять к структурам?
Вот попробовал, ну структура выдаёт тоже не 7.
Код

#include <iostream>
using namespace std;

class A{
public:
    int a,b;
    float c;
};

struct m{
    int p,x;
    float k;
};

int main()
{
A r;
m x;
memset(&r,7,sizeof(A));
cout<<r.a<<endl;
memset(&x,7,sizeof(x));
cout<<x.p;
cin.get();
}

Результат:
117901063
117901063
PM MAIL   Вверх
Alexeis
Дата 24.2.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Syltan @  23.2.2010,  22:49 Найти цитируемый пост)
То есть в основном их нужно применять к структурам?

  В С++ структура почти тоже что и класс. 

Цитата(Syltan @  23.2.2010,  22:49 Найти цитируемый пост)
Вот попробовал, ну структура выдаёт тоже не 7.

в переменной a будет 0x07070707 = 117901063 тоже в b, а в c даже посчитать трудно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Syltan
Дата 24.2.2010, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Хорошо, скажите в двух словах, какой смысл от memset?
PM MAIL   Вверх
bsa
Дата 24.2.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Syltan @  24.2.2010,  00:09 Найти цитируемый пост)
Хорошо, скажите в двух словах, какой смысл от memset? 
В основном используется для зануления (реже заполнения другими одинаковыми БАЙТАМИ) буферов (непрерывных массивов простейших типов, например char или int).

PM   Вверх
Alexeis
Дата 24.2.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Syltan @  23.2.2010,  23:09 Найти цитируемый пост)
Хорошо, скажите в двух словах, какой смысл от memset? 

  Ну нулями можно заполнить. Если массив байтов, или символов то можно заполнить чем-то иным отличным от нуля. Вообще, с точки зрения безопасности полезно объект/структуру без VMT занулять. В некоторых случаях это позволяет избежать утечек памяти. Поля указатели обязательно должны зануляться. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Syltan
Дата 24.2.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Код

В основном используется для зануления


Для зануления полей в структуре, то ест ьинициализацией кадого поля значением ноль?

Это сообщение отредактировал(а) Syltan - 24.2.2010, 00:24
PM MAIL   Вверх
Sosed
Дата 24.2.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



Был интересный пример с memset, применяли для сравнения структур, данные ведь располагаются не последовательно, отсюда просто сравнить(==) 2 структуры не получается, помогаем мемсетом:

Код

struct {
  int x;
  double y;
  char z;
} a1, a2;

memset(&a1, 0, sizeof(a)); //зануляем промежутки
memset(&a2, 0, sizeof(a));
...
//работаем с a1, a2


Если надо сравнить используем memcmp(&a1, &a2, sizeof(a1));


Это сообщение отредактировал(а) Sosed - 24.2.2010, 01:10
PM MAIL   Вверх
Syltan
Дата 24.2.2010, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Прочитал вот такое:
Код

Функция memset предназначена для заполнения памяти по некоторому адресу некотором значением.

Код

memset(&a1, 0, sizeof(a));

Заполняется память а1 значением ноль?

Ещё вопрос зачем выделять память sizeof?

Это сообщение отредактировал(а) Syltan - 24.2.2010, 01:48
PM MAIL   Вверх
Sosed
Дата 24.2.2010, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



sizeof размер возвращает
Посмотри размер структуры a1, а потом всех составляющих ее переменных. Различаться будут, значит левые байты есть. Если их не занулить, то неизвестно что там будет, и сравнить не получится.
PM MAIL   Вверх
lBugl
Дата 24.2.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: 1
Всего: 2



Цитата

Функция memset предназначена для заполнения памяти по некоторому адресу некотором значением.

угу.
memset(&a1, 0, sizeof(a));

memset это не присваивание объекту или типу значения (к этим словам не придирайтесь =) ). Она записывает в адрес в памяти (1-й параметр)  значение (2-й параметр) и продолжает идти по памяти и заполнять её (сколько? 3-й параметр).... примерно так что ли... =)
PM MAIL   Вверх
Alexeis
Дата 24.2.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Sosed @  24.2.2010,  00:04 Найти цитируемый пост)
Был интересный пример с memset, применяли для сравнения структур, данные ведь располагаются не последовательно, отсюда просто сравнить(==) 2 структуры не получается, помогаем мемсетом:

  На самом деле последовательно, в том смысле что следуют друг за другом в том порядке, в котором их объявили, просто между полями возможны "окна" не несущие ни какой информации. Если объект занулить по полям, то "окна" все равно сохраняют не инициоализированое значения, поэтому побайтовое сравнение одинаковых объектов может не получиться, ведь в окнах остались произвольные значения. Если объект занулить мемсетом, то зануляются и окна, так что становиться возможным проводить побайтовое сравнение.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Syltan
Дата 24.2.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Код

MEMSET  :offtopic записывает в адрес в памяти (1-й параметр)  значение (2-й параметр) и продолжает идти по памяти и заполнять её (сколько? 3-й параметр).... примерно так что ли... =) 

Код

 записывает в адрес в памяти (1-й параметр)  


Растолкуйте, а то как-то умно написано.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.