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

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

Войти
Регистрация
Восстановить пароль
 
joub
1 / 1 / 1
Регистрация: 08.01.2013
Сообщений: 70
#1

Уничтожается переменная по выходу из функции. так не должно быть - C++

29.05.2013, 08:56. Просмотров 312. Ответов 7
Метки нет (Все метки)

Все доброго времени суток!
В процессе отладки программки возник один вопрос...
Есть функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void bignum_fromhex(bignum_digit_t* num, std::string str, int digits) {
    int pos = 0, offset = 0;
    unsigned int len;
    len = str.size();
  char c;
  memset(num, 0, BIGNUM_SIZE(digits));
  while(len && (pos < digits)) {
    c = str[--len];
    if(c >= '0' && c <= '9')
      c -= '0';
    else if(c >= 'A' && c <= 'F')
      c -= 'A' - 10;
    else if(c >= 'a' && c <= 'f')
      c -= 'a' - 10;
    else return;
    num[pos] = num[pos] | (c << (offset++ << 2));
    if(offset == sizeof(bignum_digit_t) * 2) {
      offset = 0;
      pos++;
    }
  }
}
Получающая в качестве аргумента std::string str, так вот после выхода из этой функции - данная переменная уничтожается, хотя этого не должно происходить. Подскажите - в чем может быть проблема !??
За ранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 08:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Уничтожается переменная по выходу из функции. так не должно быть (C++):

Почему локальная переменная не уничтожается после выхода из функции - C++
В функции создается строка char *pn = new char;. Мне непонятно почему при выходе из функции эта строка доступна в main()? Почему эта строка...

Ф-ия month всегда возвращает true, хотя так не должно быть - C++
Ф-ия month всегда возвращает true, хотя так не должно быть. В этой ф-ии я должна либо ввести полностью месяц, либо три первых буквы. Эсли...

В результате вычислений программа выдает нули(хотя так не должно быть) - C++
Программа должна посчитать некоторые две величины по формулам, которые проверены аналитически, конечно. Но в результате вычислений одна из...

Как сделать так чтобы переменная в описании одной функции была доступна в описании другой? - C++
Как сделать так чтобы переменная в описании одной функции была доступна в описании другой? Заранее спасибо.

Как должна быть организована сеть офиса? Что должно быть настроено обязательно, а чего быть не должно? - Сети
Добрый день. Сразу оговорюсь, что я инженер-строитель и настройкой сети занимаюсь только потому, что больше некому. Поэтому некоторые,...

Так и должно быть? - Delphi
Народ, так и должно быть? Не красиво смотрится просто. Почему так? Выделено красным. Memo компонент на форме Align = AlClient,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
29.05.2013, 08:58 #2
таки вы передаете по значению и передается копия строки, используйте
C++
1
void bignum_fromhex(bignum_digit_t* num, std::string& str, int digits)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.05.2013, 09:11 #3
Кудаив, стоит отметить, что в коде ТС нет модификации строки, есть работа с символом, который после строки 8 уже никак не связан с str.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
29.05.2013, 09:20 #4
Tulosba, однако вопрос был именно про строку
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.05.2013, 09:33 #5
Кудаив, вопрос может и про строку, но если ТС задумал модифицировать ее, то несмотря на Ваш совет, у него ничего не получится, т.к. в самой функции ошибка. А если не нужно модифицировать, то следует использовать константную ссылку.
joub
1 / 1 / 1
Регистрация: 08.01.2013
Сообщений: 70
29.05.2013, 09:38  [ТС] #6
Мне всего лишь надо Достать из этой строки данные, не модернизируя её....

Сама строка объявляется как: std::string md5hTm
Передается в функцию как: bignum_fromhex(md5b, md5hTm, BIGNUM_SIZE(ECCRYPT_BIGNUM_DIGITS));

Что мне исправить ?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.05.2013, 09:42 #7
Цитата Сообщение от joub Посмотреть сообщение
Мне всего лишь надо Достать из этой строки данные, не модернизируя её....
Тогда какая разница: уничтожается строка или нет?
Сигнатуру задайте такую например:
C++
1
void bignum_fromhex(bignum_digit_t* num, const std::string& str, int digits)
joub
1 / 1 / 1
Регистрация: 08.01.2013
Сообщений: 70
29.05.2013, 10:13  [ТС] #8
Разобрался... простое переполнение
BIGNUM_SIZE(ECCRYPT_BIGNUM_DIGITS) представляет собой число в 2 раза большее чем выделено под num
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 10:13
Привет! Вот еще темы с ответами:

Так должно быть? - Жесткие диски
Доброго времени суток! Тут по случаю восстанавливаю файлы с битого HDD программкой Starus Partition Recovery, данная программка...

Значение должно быть целым числом но отдельно переменная показывает что число целое - MathCAD
На рисунке я отдельно выделил ak и k там у меня целые числа Но на формуле именно переменная k горит красным. Коэффициент Nn это вместо...

Нет 404, так и должно быть? - WordPress
всем привет! недавно заметил, что если дописать к url страницы сайта адрес другой существующей страницы, то мы попадем на эту страницу. ...

PHP Подскажите, так и должно быть или ?.. - PHP
Всем привет, Операционка - убунту, поставил себе локальный сервер, только начал осваивать все это дело, посему не знаю как с этим...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.05.2013, 10:13
Ответ Создать тему
Опции темы

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