Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2015, 16:23   #1
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию Как правильно в куче разместить массив символов

Например, есть переменная:
char *x;
Я хочу в процессе работы программы присваивать массиву последовально
новые значения. Примерно так:
x[i] = 't';
i++;

Но я не понимаю, что нужно сделать с переменной, чтобы не было проблем,
ни при компиляции, ни при выполнении программы.
Я пробовал так:
x = new char;
и так:
x = new char[1024];
, но это вызывает ошибку.
А если оставить просто char *x;,
то тоже ошибка, так как не задан размер выделяемой памяти.
Как обойти эту проблему?
chipside вне форума Ответить с цитированием
Старый 27.08.2015, 16:49   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Код:
x = new char[1024];
Подобное выделение памяти вроде бы является правильным.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 27.08.2015, 16:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
char *x= new char[1024];
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2015, 17:49   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от chipside Посмотреть сообщение
чтобы не было проблем,
std::string
_Bers вне форума Ответить с цитированием
Старый 27.08.2015, 18:11   #5
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию

string: Тоже вариант, но я пока подумаю над неклассовой переменной.
Т.к. наращивание будет литералами.

char *yTestChars = new char[1024];
При использовании такого метода в g++ 4.9.2 компиляция идёт нормальна и сборка соответственно, но при выполнении такая ошибка:
Цитата:
*** Error in `bin/ycalc': free(): invalid size: 0x000000000138e090 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x77d9e)[0x7fcfd7c6dd9e]
/lib64/libc.so.6(+0x7fa0c)[0x7fcfd7c75a0c]
/lib64/libc.so.6(+0x81812)[0x7fcfd7c77812]
/lib64/libc.so.6(__libc_malloc+0x6e)[0x7fcfd7c7915e]
/lib64/libstdc++.so.6(_Znwm+0x18)[0x7fcfd8531608]
/lib64/libstdc++.so.6(_Znam+0x9)[0x7fcfd85316b9]
bin/ycalc[0x402906]
bin/ycalc[0x400e9b]
/lib64/libc.so.6(__libc_start_main+0xf0)[0x7fcfd7c15fe0]
bin/ycalc[0x400d59]
======= Memory map: ========
00400000-00404000 r-xp 00000000 08:08 1592980 /home/Chip/workspace/ycalc/6/bin/ycalc
00603000-00604000 r--p 00003000 08:08 1592980 /home/Chip/workspace/ycalc/6/bin/ycalc
00604000-00605000 rw-p 00004000 08:08 1592980 /home/Chip/workspace/ycalc/6/bin/ycalc
0138e000-013d1000 rw-p 00000000 00:00 0 [heap]
7fcfd7bf6000-7fcfd7da9000 r-xp 00000000 08:08 1317321 /usr/lib64/libc-2.20.so
7fcfd7da9000-7fcfd7fa9000 ---p 001b3000 08:08 1317321 /usr/lib64/libc-2.20.so
7fcfd7fa9000-7fcfd7fad000 r--p 001b3000 08:08 1317321 /usr/lib64/libc-2.20.so
7fcfd7fad000-7fcfd7faf000 rw-p 001b7000 08:08 1317321 /usr/lib64/libc-2.20.so
7fcfd7faf000-7fcfd7fb3000 rw-p 00000000 00:00 0
7fcfd7fb3000-7fcfd7fc9000 r-xp 00000000 08:08 1311386 /usr/lib64/libgcc_s-4.9.2-20150212.so.1
7fcfd7fc9000-7fcfd81c8000 ---p 00016000 08:08 1311386 /usr/lib64/libgcc_s-4.9.2-20150212.so.1
7fcfd81c8000-7fcfd81c9000 r--p 00015000 08:08 1311386 /usr/lib64/libgcc_s-4.9.2-20150212.so.1
7fcfd81c9000-7fcfd81ca000 rw-p 00016000 08:08 1311386 /usr/lib64/libgcc_s-4.9.2-20150212.so.1
7fcfd81ca000-7fcfd82d1000 r-xp 00000000 08:08 1317329 /usr/lib64/libm-2.20.so
7fcfd82d1000-7fcfd84d0000 ---p 00107000 08:08 1317329 /usr/lib64/libm-2.20.so
7fcfd84d0000-7fcfd84d1000 r--p 00106000 08:08 1317329 /usr/lib64/libm-2.20.so
7fcfd84d1000-7fcfd84d2000 rw-p 00107000 08:08 1317329 /usr/lib64/libm-2.20.so
7fcfd84d2000-7fcfd85c2000 r-xp 00000000 08:08 1311840 /usr/lib64/libstdc++.so.6.0.20
7fcfd85c2000-7fcfd87c2000 ---p 000f0000 08:08 1311840 /usr/lib64/libstdc++.so.6.0.20
7fcfd87c2000-7fcfd87ca000 r--p 000f0000 08:08 1311840 /usr/lib64/libstdc++.so.6.0.20
7fcfd87ca000-7fcfd87cc000 rw-p 000f8000 08:08 1311840 /usr/lib64/libstdc++.so.6.0.20
7fcfd87cc000-7fcfd87e1000 rw-p 00000000 00:00 0
7fcfd87e1000-7fcfd8802000 r-xp 00000000 08:08 1316217 /usr/lib64/ld-2.20.so
7fcfd89d0000-7fcfd89d5000 rw-p 00000000 00:00 0
7fcfd89fe000-7fcfd8a02000 rw-p 00000000 00:00 0
7fcfd8a02000-7fcfd8a03000 r--p 00021000 08:08 1316217 /usr/lib64/ld-2.20.so
7fcfd8a03000-7fcfd8a04000 rw-p 00022000 08:08 1316217 /usr/lib64/ld-2.20.so
7fcfd8a04000-7fcfd8a05000 rw-p 00000000 00:00 0
7fff5f01c000-7fff5f03d000 rw-p 00000000 00:00 0 [stack]
7fff5f0ee000-7fff5f0f0000 r--p 00000000 00:00 0 [vvar]
7fff5f0f0000-7fff5f0f2000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Аварийный останов (core dumped)
Из ключей компиляции только указание на C++2011.
Так всё по дефолту для x86+64 Linux.

Код я окружил cout. Ошибка ловится прямо на месте создания переменной
с объявленным количеством памяти.

Последний раз редактировалось Stilet; 27.08.2015 в 18:24.
chipside вне форума Ответить с цитированием
Старый 27.08.2015, 18:24   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код в студию )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2015, 18:44   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от chipside Посмотреть сообщение
string: Тоже вариант, но я пока подумаю над неклассовой переменной.
Т.к. наращивание будет литералами.
у вас есть два варианта:

либо вы будете иметь проблемы,
и тогда приятно вам долбаться дальше с ручной работой.

либо возьмете готовый, удобный, безопасный инструмент std::string,
и никаких проблем.

а чего вы там именно наращиваете - фактор монопенисуальный.
потому что std::string - эффективное средство.

вряд ли вы сможете сделать ещё лучше, быстрее, и экономичнее.


---------------------------------------------------

судя по логам у вас там порча памяти.
а вообще лепаты в отпуске.

Последний раз редактировалось _Bers; 27.08.2015 в 18:48.
_Bers вне форума Ответить с цитированием
Старый 27.08.2015, 19:00   #8
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Код нужно полностью.

Код слишком огромный, да и сырой.
Если Вам всё ещё будет интересно,
то я постараюсь выложить архив в яндекс.диск в воскресенье и дам сюда ссылку.
А пока скажу так.
Переменная
char *lalala;
Получает данные из функции, которая возвращает тип char*
Скажем
char* Function1(anOperator* myAnyCode);
Функция использует внутри другую функцию, которая использует переменную
anOperator, которую я определил с помощью enum.
Примерно так.
y[i] = Function2(myAnyCode[j]);
Сама функция имеет примерно такой заголовок
char Function2(anOperator theLaLa);
В теле Function1() идёт цикл, который обращается n-ное количество раз к функции
Function2() и наращивает char*.
Я вполне допускаю, что компилятор мог собрать программу так, что ошибка ловится
совсем не в том месте, где думаю лично я...
В общем, в воскресенье выложу, что получилось.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"

Последний раз редактировалось Stilet; 27.08.2015 в 19:42.
challengerr вне форума Ответить с цитированием
Старый 27.08.2015, 21:19   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Код нужно полностью.

Код слишком огромный, да и сырой.
Если Вам всё ещё будет интересно,
то я постараюсь выложить архив в яндекс.диск в воскресенье и дам сюда ссылку.
А пока скажу так.
Переменная
char *lalala;
Получает данные из функции, которая возвращает тип char*
Скажем
char* Function1(anOperator* myAnyCode);
Функция использует внутри другую функцию, которая использует переменную
anOperator, которую я определил с помощью enum.
Примерно так.
y[i] = Function2(myAnyCode[j]);
Сама функция имеет примерно такой заголовок
char Function2(anOperator theLaLa);
В теле Function1() идёт цикл, который обращается n-ное количество раз к функции
Function2() и наращивает char*.
Я вполне допускаю, что компилятор мог собрать программу так, что ошибка ловится
совсем не в том месте, где думаю лично я...
В общем, в воскресенье выложу, что получилось.
эм... Автор темы превратился в challengerr'а?oO
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 27.08.2015, 21:42   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Видимо портал глюкнул после слияния постов...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти) polin11 Общие вопросы C/C++ 1 08.08.2015 02:02
Как правильно разместить текст на сайте... XYLIGANXYL HTML и CSS 5 30.01.2011 04:20
Правильно разместить div-ы Skalka HTML и CSS 0 23.12.2010 08:32
Как конвертировать массив символов в массив байт davinci C++ Builder 6 30.10.2010 18:09
Массив в dll - как разместить массив в dll и как вызвать элемент этого массива по индексу? Кинельски Помощь студентам 0 23.05.2010 20:52