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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
ZaMaZaN4iK
Мой лучший друг-отладчик!
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
#1

memset() - C++

11.05.2013, 22:48. Просмотров 1146. Ответов 7
Метки нет (Все метки)

Здравсвуйте. У меня возник вопрос касательно 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
29
30
31
#include <iostream>
#include <memory.h>
#include <cstdio>
 
using namespace std;
 
long long n,ans=0,thing[101],i,c,cost;
bool flag[101];
 
 
int main()
{
    memset(thing,1001,sizeof (thing));
    memset(flag,0,sizeof (flag));
    scanf("%I64d",&n);
    for(i=0;i<n;++i)
    {
        scanf("%I64d%I64d",&c,&cost);
        cout<<thing[c];
        if(cost < thing[c])
        {
            thing[c]=cost;
            flag[c]=true;
        }
    }
    for(i=1;i<101;++i)
        if(flag[i])
            ans+=thing[i];
    printf("%I64d",ans);
    system("pause");  
}
Почему memset() не заполняет массив thing значением 1001?А вместо этого в массиве появляются другие значения?
Но если заменить
C++
1
memset(thing,1001,sizeof (thing));
на
C++
1
memset(thing,0,sizeof (thing));
то всё работает.

Помогите разобраться с особенностью memset()
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,109
11.05.2013, 22:52     memset() #2
memset хоть и принимает int, но внутри себя конвертирует его в unsigned char и именно этим значением заполняет память.
ZaMaZaN4iK
Мой лучший друг-отладчик!
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
11.05.2013, 22:55  [ТС]     memset() #3
NoMasters, то есть memset() может заполнять только значениями от 0 до 255?
Croessmah
Модератор
Эксперт CЭксперт С++
12727 / 7187 / 802
Регистрация: 27.09.2012
Сообщений: 17,727
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 22:57     memset() #4
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
C++
1
memset(thing,1001,sizeof (thing));
Этим значением заполняется каждый байт указанной памяти, а не каждый элемент Вашего массива. Так как 1001 не влезет в 1 байт, то будет переполнение
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,109
11.05.2013, 22:58     memset() #5
ZaMaZaN4iK, вроде того. Смысл в том, что значение задаётся для отдельного байта.
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
11.05.2013, 22:58     memset() #6
Да. Он заполняет значениями от 0 до 255 включительно.
ZaMaZaN4iK
Мой лучший друг-отладчик!
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
11.05.2013, 22:59  [ТС]     memset() #7
Всё, спасибо большое - разобрался!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 23:01     memset()
Еще ссылки по теме:

C# Есть ли аналог memset
Не найден memset Visual C++
C++ Memset для двухмерного массива
Assembler Функция memset
C++ по поводу memset

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12727 / 7187 / 802
Регистрация: 27.09.2012
Сообщений: 17,727
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 23:01     memset() #8
Как пример:
C++
1
2
3
4
5
6
7
8
#include<iostream>
 
int main(){
    int i=10;
    memset(&i,0xFF,sizeof(int));
    std::cout<<i<<std::endl;
    return 0;
}
в результате на экране видим не 255, а -1, т.к. каждый байт был заполнен значением 0xFF, то бишь все биты единичны(включая знаковый). А все единицы - это -1
Yandex
Объявления
11.05.2013, 23:01     memset()
Ответ Создать тему
Опции темы

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