Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.71
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

memset - C++

23.02.2010, 22:25. Просмотров 7054. Ответов 16
Метки нет (Все метки)

Попробовал потренироватся, как работает функция мемсет.
Вот попробовал самый простенький код, но не выдаёт результат 7, хотя все поля
инициализированны этой функцией семёрками.
Вот исходник:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2010, 22:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос memset (C++):

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

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

memset, memcpy - C++
Использую MSVS 2008. Почему memcpy работает только с char? То есть, такой код работает: int main() { char a1 = &quot;123&quot;; ...

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

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

Запустить программу. Библиотека для memset - C++
Помогите мне, пожалуйста, запустить программу. Текст отсюда...

16
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.02.2010, 22:44 #2
Цитата Сообщение от Syltan Посмотреть сообщение
хотя все поля
инициализированны этой функцией семёрками.
Почитай-ка про memset. Найди, где там сказано, что эта функция инициализирует какие-нибудь поля, и напиши сюда.
0
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
23.02.2010, 23:24  [ТС] #3
Вообще прочитал ,что эта функция заполняет буфер определённым числом или символом, если это строчный буфер.
Но прочитал также что эта функция применяется для обнуления структур, это означает значит,
что поля. которые были в струткуру они инициализируются нулями?
А что обстоит склассами тогда?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
23.02.2010, 23:33 #4
Цитата Сообщение от Syltan Посмотреть сообщение
А что обстоит склассами тогда?
для этого надо знать как представляются класы в памяти
0
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
23.02.2010, 23:50  [ТС] #5
Покажите хоть простой пример с классом, как она работает.
Вот что я попробовал и вышло.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
23.02.2010, 23:57 #6
Syltan, скорей всего все переменные в сруктуре удут не в смежных участках памяти, тоже касается и самой структуры (ссылки на нее)
0
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:00  [ТС] #7
Русским языком можно и на примерах, я на жестах не понимаю. Я учусь С++ только на примерах. У меня какие-то бредовые результаты.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
24.02.2010, 00:04 #8
Цитата Сообщение от Syltan Посмотреть сообщение
Я учусь С++ только на примерах.
Я бы взял на себя смелость рекомендовать тебе почитать книжку/учебник.............
0
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:10  [ТС] #9
Хорошо, скажите в двух словах, смысл memset какой?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
24.02.2010, 00:14 #10
Syltan, поймешь с опытом, а для этого тебе нужно прочитать о нем все что только можешь, кстати гуглить никто не запрещал
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
24.02.2010, 00:17 #11
Цитата Сообщение от Syltan Посмотреть сообщение
Хорошо, скажите в двух словах, какой смысл от memset?
Цитата Сообщение от Syltan Посмотреть сообщение
Вообще прочитал ,что эта функция заполняет буфер определённым числом или символом, если это строчный буфер.
Но прочитал также что эта функция применяется для обнуления структур
Вы сами себе ответили Функция memset() заполняет каждый(!) байт в переданной последовательности указанным значением. Для обнуления структур в С её действительно удобно использовать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
    int ival;
    double dval;
} TwoVals_t;
 
int main(void){
    TwoVals_t *arr;
    int i, cnt = 3;
    
    if ( ( arr = (TwoVals_t*)calloc(cnt, sizeof(TwoVals_t)) ) == NULL )
        exit(1);
    memset(arr, 0, cnt * sizeof(TwoVals_t));
    
    for ( i = 0; i < cnt; ++i ){
        if ( arr[i].ival != 0 || arr[i].dval != 0.0 ){
            printf("Shit happens!\n");
            exit(1);
        }
    }
    printf("All values is set to zero\n");
    
    free(arr);
    exit(0);
}
В STL С++ есть функция fill - вот с её помощью можно заполнять сразу все поля класса, и то при условии, что для класса определён оператор = (ну или тот, который компилятор сам сделает, подойдёт)...

Добавлено через 1 минуту
Цитата Сообщение от outoftime Посмотреть сообщение
скорей всего все переменные в сруктуре удут не в смежных участках памяти
Да ну?!

кстати, calloc() и так значения в 0 устанавливает, для чистоты эксперимента лучше
C
1
if ( ( arr = (TwoVals_t*)malloc(cnt * sizeof(TwoVals_t)) ) == NULL )
написать, но сути не меняет...
2
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:18  [ТС] #12
А на С++ можно пример, а то эти калок только на С и exit(1);
такое не видал на С++ и free(arr); также.
Скажите, ещё что это за подход?
C++
1
2
3
4
typedef struct {
        int ival;
        double dval;
} TwoVals_t;
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
24.02.2010, 00:28 #13
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите, ещё что это за подход?
C
1
2
3
4
5
6
7
struct TwoVals{
        int ival;
        double dval;
};
...
TwoVals a, b; /* ОШИБКА!!! */
struct TwoVals a, b; /* только так */
Вот, чтобы каждый раз struct не писать, можно описать безымянную (не обязательно) структуру и с помощью typedef объявить такой тип данных. Тогда запись вида
C
1
TwoVals_t a, b;
будет вполне нормальной...
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.02.2010, 00:30 #14
Цитата Сообщение от Syltan Посмотреть сообщение
что поля. которые были в струткуру они инициализируются нулями?
memset о твоих полях ничего не знает. Он видит указатель на буфер и просто забивает его значениями. Никакими полями он не руководствуется. И что будет если четыре байта int забить 7?
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
24.02.2010, 00:43 #15
Цитата Сообщение от Syltan Посмотреть сообщение
А на С++ можно пример
Ага.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
    
class TwoVals {
public:
    TwoVals() : ival(0), dval(0.0) {}
    TwoVals(int i, double d) : ival(i), dval(d) {}
    friend std::ostream& operator << (std::ostream& ost, const TwoVals& t){
        ost << "ival = " << t.ival << std::endl << "dval = " << t.dval << std::endl;
        return ost;
    }
private:
    int ival;
    double dval;
};
 
int main(){
    const int cnt = 3;
    std::vector<TwoVals> arr(cnt);
    TwoVals test(7, 7.7);
    
    std::fill(arr.begin(), arr.end(), test);
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<TwoVals>(std::cout, "\n"));
    
    return 0;
}
1
24.02.2010, 00:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2010, 00:43
Привет! Вот еще темы с ответами:

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

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

Функция memset - Assembler
Здравствуйте! Помогите, пожалуйста, с реализацией вызова memset в ассемблере. Я пишу ассемблерную вставку в программу на Си, нужно...

Не найден memset - Visual C++
День добрый во время выполнения кода SCARD_READERSTATEA state; memset(&amp;state,0,sizeof(state)); state.szReader = reader; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru