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

Утечка памяти, лишнее выделение байтов

02.02.2023, 21:27. Показов 842. Ответов 8

Студворк — интернет-сервис помощи студентам
Проблемы начинаются с момента выделения памяти str = (char*) malloc((len+count) * sizeof(char));
тут нужно выделить 12 байтов, но выделяется 14 (len+count = 12) после чего на выходе лишние 2 символа.
Вход HELLOVORLD ожидаю -> HELXLOVORLDX получаю -> HELXLOVORLDX╚╚
Не знаю как исправить, сразу после объявления str пишу и получаю printf("%d", strlen(str)); = 6 (хотя по идее должно быть 12)

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
33
34
35
36
37
38
char* text_changer(char *text) {
    char *ptext = normalize(text),
         *str;
    short count = 0,
          len = strlen(ptext),
          n = 0;
 
    for (size_t i = 1; i < len; i++)
    {
        if (ptext[i] == ptext[i-1] && ptext[i] != 'X') { count++; }
    }
    if ((len + count) % 2 != 0) { count++; n = 1; }
 
    str = (char*) malloc((len+count) * sizeof(char));
 
    for (size_t m = 1, i = 1; i < len; i++)
    {
        if (ptext[i] == ptext[i-1])
        {
            str[m-1] = ptext[i-1];
            str[m] = 'X';
            str[m+1] = ptext[i];
            m += 2;
        }
        else
        {
            str[m] = ptext[i];
            str[m-1] = ptext[i-1];
            m++;
        }
    }
    free(ptext);
 
    if (n == 1) { str[len+count-1] = 'X'; }
 
    printf("%s", str);
    return str;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2023, 21:27
Ответы с готовыми решениями:

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при выходе из нее указатель теряется. Или не...

Сканирование байтов в памяти, и получение начального адреса байтов
Привет форумчане! У меня вопрос, как просканировать память у процесса так, чтобы получить адрес начала байтов в памяти? Я попробовал...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

8
 Аватар для analogov net
2523 / 1122 / 493
Регистрация: 17.11.2018
Сообщений: 2,828
02.02.2023, 21:47
Vlad1x, на 35 строке воткни:
C
1
str[len + count] = '\0';
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
03.02.2023, 09:21
analogov net, тогда надо еще и памяти выделить на один больше под этот символ
0
 Аватар для analogov net
2523 / 1122 / 493
Регистрация: 17.11.2018
Сообщений: 2,828
03.02.2023, 13:15
Donkix, я не против. Надо, так надо...
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
03.02.2023, 14:53
Цитата Сообщение от Vlad1x Посмотреть сообщение
тут нужно выделить 12 байтов, но выделяется 14
о выравнивании слышал когда-нибудь?
Цитата Сообщение от Vlad1x Посмотреть сообщение
Вход HELLOVORLD ожидаю -> HELXLOVORLDX получаю -> HELXLOVORLDX╚╚
Цитата Сообщение от Vlad1x Посмотреть сообщение
str[m+1] = ptext[i];
            m += 2;
не боишься утечки памяти?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
04.02.2023, 05:29
Цитата Сообщение от Vlad1x Посмотреть сообщение
Проблемы начинаются с момента выделения памяти str = (char*) malloc((len+count) * sizeof(char));
тут нужно выделить 12 байтов, но выделяется 14 (len+count = 12)
Что? С чего это вы сделали такой странный вывод?

Цитата Сообщение от Vlad1x Посмотреть сообщение
Вход HELLOVORLD ожидаю -> HELXLOVORLDX получаю -> HELXLOVORLDX╚╚
Обыкновенное неопределенное поведение из-за того, что вы передали в printf("%s" что-то, что не является строкой. При чем здесь выделение памяти и при чем здесь "утечка памяти"?

Цитата Сообщение от Vlad1x Посмотреть сообщение
Не знаю как исправить, сразу после объявления str пишу и получаю printf("%d", strlen(str)); = 6
Это как это? "Сразу после объявления str" в str содержится мусор. Чего вы тогда ожидали от strlen(str)? И почему вы печатаете strlen через %d? Как это должно работать?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
04.02.2023, 09:29
Цитата Сообщение от ValeryS Посмотреть сообщение
не боишься утечки памяти?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
и при чем здесь "утечка памяти"?
да вот же она
Цитата Сообщение от Vlad1x Посмотреть сообщение
str = (char*) malloc((len+count) * sizeof(char));
выделение памяти определенного размера
Цитата Сообщение от Vlad1x Посмотреть сообщение
str[m+1] = ptext[i];
            m += 2;
запись за пределами выделенной памяти , в результате нарушается структура
Цитата Сообщение от Vlad1x Посмотреть сообщение
free(ptext);
из-за этого удалить память не можем
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
04.02.2023, 09:33
Цитата Сообщение от ValeryS Посмотреть сообщение
запись за пределами выделенной памяти , в результате нарушается структура
Нет. В результате возникает неопределенное поведение.

Цитата Сообщение от ValeryS Посмотреть сообщение
из-за этого удалить память не можем
Нет. Из-за этого возникает неопределенное поведение.
0
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
08.02.2023, 00:58
Выводите так:
C
1
printf("%.*s", len+count, str);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.02.2023, 00:58
Помогаю со студенческими работами здесь

ListBoxItem выделение, лишнее место
Доброго времени суток. Возможно проблема заезженная, извиняйте. У меня имеется ListBox. Описан шаблон для содержимого. Но...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

Неправильное выделение байтов
void *_upointer; int type:2; В классе присутствуют 2 переменные. Насколько я знаю, указатель занимает 4 байта, а int в данном случае...

Написать программу, определяющую количество байтов памяти с ненулевыми значениями для первых 256 Кб физической памяти в реальном режиме работы Intel 8
Доброе время суток, моя задача похоже на задачу из этой темы https://www.cyberforum.ru/assembler/thread762097.html. Но обладаю такими же...

Утечка памяти
Как полностью освободить память? Утекает 39 байт int ft_badend(char ***arr, int k) { int i; int j; i = 0; j = 0; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru