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

Странное поведение new - C++

Восстановить пароль Регистрация
 
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
17.01.2013, 18:18     Странное поведение new #1
Объясните почему оператор new выделяет неверное количество памяти?
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
32
# include <iostream>
using namespace std;
char* interpitator( int dig, int sys);
void main ()
{
    interpitator( 35, 18);
    interpitator( 27, 16);
    interpitator( 13, 5);
}
char* interpitator( int dig, int sys)
{
    char* rezult;
    int counter[10] , i = 0, j = 0, t = 0;
    char arry[36] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G',
    'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    while(dig)
    {
        counter[i++] = dig % sys;
        dig = dig/sys;
    }
    
    rezult = new char[i];//тут начинается интересное
    cout<<i<<endl;//проверяем i = 2 всё верно
    cout<<strlen(rezult)<<endl;// а строка = 14 ??? почему???
    memset( rezult, '/0', i);
    for( int j = i-1; j >= 0; j--) 
        rezult[t++] = arry[counter[j]];
    cout<<rezult<<endl;//поэтому сдесь после значения печатается мусор всякий
    cout<<endl;
    
    return rezult;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2013, 18:18     Странное поведение new
Посмотрите здесь:

C++ Странное поведение транслятора
C++ Странное поведение компилятора
C++ Странное поведение
C++ Странное поведение getline
Странное поведение wstring C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.01.2013, 18:42     Странное поведение new #2
Очевидно, в строке нет признака конца - нулевого символа.
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
17.01.2013, 18:47  [ТС]     Странное поведение new #3
хорошо после такой манипуляции тоже самое
C++
1
2
3
4
    
memset( rezult, '/0', i);
cout<<i<<endl;//проверяем i = 2
cout<<strlen(rezult)<<endl;// а строка = 14
сначала обнулили потом посчитали
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.01.2013, 18:49     Странное поведение new #4
Как оно вообще собирается со слешем не в ту сторону?)
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
17.01.2013, 19:10  [ТС]     Странное поведение new #5
согласен, со слешем я натупил, но вопроса это не снимает почему тогда sizeof(rezult) даёт 4 байта, я ведь память выделяю под 2?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.01.2013, 19:13     Странное поведение new #6
sizeof возвращает размер самого указателя, а не данных, на которые он указывает. Указатель занимает 4 байта, все логично.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 19:34     Странное поведение new
Еще ссылки по теме:

странное поведение указателя C++
C++ Странное поведение кода
C++ Странное поведение программы

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.01.2013, 19:34     Странное поведение new #7
Размер строки должен быть на единицу больше, чем в ней есть символов, чтобы на конце записать '\0'. У тебя этого нет, поэтому после записанных символов оказывается мусор, который выводится до тех пор, пока не встретится ноль.
Yandex
Объявления
17.01.2013, 19:34     Странное поведение new
Ответ Создать тему
Опции темы

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