Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51

Выделение памяти в куче для строки для реализации длинной арифметики

16.07.2014, 22:56. Показов 1773. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, пишу класс string, на основе которого потом хочу реализовать класс для длинной арифметики. Поэтому мне понадобился такой конструктор:
C++
1
2
3
4
5
6
7
8
9
//  constructor by integer
string::string( const int number, const int base ) {
    char * buffer = (char *)realloc(NULL, sizeof(char)*sizeof(int)+5);
    _itoa(number, buffer, base );
    length = strlen(buffer);
    takeMemory( NULL, length );
    memcpy(data,buffer,length);
    free( buffer );
}
В чем, собственно проблема.
Если в строке "char * buffer = (char *)realloc(NULL, sizeof(char)*sizeof(int)+5);" вместо 5 ставить что то меньшее, то во время выполнения free( buffer ) получаю сообщение о возможном повреждении кучи. Помогите понять причину происходящего, почему именно 5?


Программа-тестер:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using std::endl;
using std::cout;
using std::cin;
 
#include "string.h"
 
int main ( void ) {
    int n = 255;
    string binary( n, 2 );
 
    std::cout << binary;
    
    cin.get(); cin.get();
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2014, 22:56
Ответы с готовыми решениями:

Ошибка в реализации длинной арифметики
Здравствуйте. Я скопировал с e-maxx'а и объединил всё в одну программу: #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

Ищу примеры реализации длинной арифметики
Здравствуйте! Скиньте пожалуйста примеры решения задач на тему &quot;Длинная арифметика&quot;! Желательно с подробным пояснением! Язык C++....

Бенчмарк для длинной арифметики
Долгими зимними вечерами я люблю страдать ерундой и писать свои велосипеды. Таким образом, я написал класс для длинной арифметики. И...

9
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2014, 23:06
Цитата Сообщение от satisfactor Посмотреть сообщение
класс string, на основе которого потом хочу реализовать класс для длинной арифметики.
Любопытно. Зачем такое совмещение?
По теме:
1. Если пишите на C++ забудьте про realloc. Это сишная функция.
2. Раз уж используете, то ознакомьтесь с документацией.
3. sizeof(char)*sizeof(int). Чего вообще Вы этим хотели добиться?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.07.2014, 23:12
Может мало выделяешь? 1*4 + 5 = 9. itoa не знает допустимый размер строки и может выйти за пределы.
0
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:18  [ТС]
Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Может мало выделяешь? 1*4 + 5 = 9. itoa не знает допустимый размер строки и может выйти за пределы.
На моей системе sizeof(int) = 8
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2014, 23:19
Цитата Сообщение от nmcf Посмотреть сообщение
Может мало выделяешь?
А других вариантов и быть не может. https://www.cyberforum.ru/cgi-bin/latex.cgi?{255}_{10} = {11111111}_{2}
Т.е. 8 символов + 1 терминирующий. Плохо, что ТС вообще не понимает что делает.

Добавлено через 1 минуту
Цитата Сообщение от satisfactor Посмотреть сообщение
Ну это, как мне кажется, даст количество байт в int.
Даст. Но как это связано с тем, что Вы хотите получить? Или вы думаете, что в строку из sizeof(int) байт поместится любое число из диапазона int (в любой системе счисления)?
0
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:20  [ТС]
Tulosba,
Правильно, 8 символов, что есть sizeof(int) + 1 на нуль-символ. Изначально так и было. Но Работает только с sizeof(int) + 5. Так где я что не понял?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2014, 23:23
Цитата Сообщение от satisfactor Посмотреть сообщение
Так где я что не понял?
C++
1
2
int i = 1234567890; // sizeof(int) = 8 (поверю Вам на слово)
const char c[] = "1234567890"; // sizeof(c) = 11 (кол-во символов+терминирующий нуль)
0
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:24  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Даст. Но как это связано с тем, что Вы хотите получить? Или вы думаете, что в строку из sizeof(int) байт поместится любое число из диапазона int (в любой системе счисления)?
в любой системе, конечно, нет. Но в данном случае функции передается base = 2...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2014, 23:26
Лучший ответ Сообщение было отмечено satisfactor как решение

Решение

Цитата Сообщение от satisfactor Посмотреть сообщение
Но в данном случае функции передается base = 2...
И что из этого следует? На каждый бит потребуется байт для отображения в виде строки.
Если Ваш sizeof(int) = 8, то это 8 байт = 8*8 = 64 бита ... дальше понятно?
1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
16.07.2014, 23:31
Цитата Сообщение от satisfactor Посмотреть сообщение
Но в данном случае функции передается base = 2...
ну и сколько нужно ячеек памяти чтобы записать char (1 байт) как минимум 9, 8 под биты и 1 под завершающий 0
если ты работаешь с двоичным представлением то тебе нужен размер в битах а sizeof дает размер в байтах
умножай результат на 8
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2014, 23:31
Помогаю со студенческими работами здесь

Исходники для длинной арифметики на VBA
Всем привет! По просьбе Аксима, выкладываю исходники и наработки для длинной арифметики на VBA. Выкладываю самый быстрый &quot;на...

Оптимизация класса для длинной арифметики
Решил написать класс для работы с ОООЧЕНЬ длинными числами Какая была концепция : 1 - Числа дробные 2 - Числа хранятся в виде...

Перевод системы счистления для длинной арифметики
Всем привет. Была задача высчитать 1кк знаков числа пи - стал писать свою длинную арифметику, язык C++. Как у всех делать, было не...

Быстрее ли GPU и CUDA для задач длинной арифметики и криптографии?
Быстрее ли было бы использовать - GPU и CUDA для задач длинной арифметики и криптографии? Есть класс IntegerBig, в котором длинное...

Выделение памяти в куче
Добрый день. Столкнулся с такой проблемой при выделении памяти под матрицу выдает ошибку &quot;Вызвано исключение: нарушение доступа...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru