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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2010, 19:42   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Динамический массив - или всё таки не динамический?

Здравия желаю))
Да-да! этот вопрос про то "как в классическом Си создать динамический массив" - и вы опять правы - в поиске полно информации , в частности -
Цитата:
Создадим динамический массив на 10 элементов:
view source
print?
Код:
1	int *p;
2	p = (int*)calloc(10,sizeof(int)); // Выделяем память
3	//... // какой-либо код
4	free (p); // удалим массив, если он нам больше не нужен
или -
Цитата:
А как быть в си, если нужен динамический массив?


Очень просто:

Код:
int *a, n, i;
scanf("%d", &n);
a = malloc(n*sizeof(int));
// далее работаем как с массивом, например:
for (i=0; i <n; i++) {
     a[i]=0;
} // for
................................... ..........
free(a); // когда станет не нужно
но это всё не динамическое выделение памяти - может ли кто -нибудь чиркнуть пару строчек на тему выделения выделения памяти непосредственно в цикле (например если считывается строка)
Заранее благодарю)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 07.12.2010, 19:47   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
но это всё не динамическое выделение памяти
а интересно какое?

для строк хорошо подойдет realloc(то есть если перестало в буфер влазить, то выделяем новый больший)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.12.2010, 19:49   #3
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Если ты хочешь, что бы память для следующего элемента выделялась по команде аля push_back и дописывалась в конец массива, то так делать нелья. Можно делать realloc но это по сути выделение новой памяти нужно размера и копирование старого куска туда. Большой производительности соотвественно не жди.
coinkrsk вне форума Ответить с цитированием
Старый 07.12.2010, 19:52   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
но это всё не динамическое выделение памяти
Каким же это местом оно не динамическое? Вполне себе динамическое. А если вам нужно совсем суровое динамическое выделение памяти - можете использовать списки. Из пушек по воробьям, да-с. Обычно все-таки хватает временной строки фиксированного размера, из которой вы потом пишете в строку в точности необходимого размера. Если же не хватает - можете считать сначала первые N символов, потом увеличить размер строки до 2N, считать еще N и т.д.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.12.2010, 20:11   #5
Ru_DoLF
Ubuntu 10.04
Пользователь
 
Аватар для Ru_DoLF
 
Регистрация: 15.07.2010
Сообщений: 51
По умолчанию

Цитата:
но это всё не динамическое выделение памяти...
выделения выделения памяти непосредственно в цикле...
Как я понял память динамически у нас выделяется только в цикле))

А если все итерации цикла написать самому?)
Что я имею ввиду:
Код:
char *string;

for (int i = 1; i <= 5; ++i)
	string = (char *)realloc(string, sizeof(char) * i);
Это динамическое выделение памяти (в цикле же)))))

Код:
char *string;
int i = 1;

string = (char *)realloc(sizeof(char) * i);
++i;

string = (char *)realloc(sizeof(char) * i);
++i;

string = (char *)realloc(sizeof(char) * i);
++i;

string = (char *)realloc(sizeof(char) * i);
++i;

string = (char *)realloc(sizeof(char) * i);
++i;
А вот это уже по твоей логике не динамическое выделение памяти) Но сделали то мы то же самое...
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)
Ru_DoLF вне форума Ответить с цитированием
Старый 07.12.2010, 21:36   #6
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

в делфи есть
Цитата:
совсем суровое динамическое выделение памяти
имя ему -
Код:
setlength
например я могу анализировать символы некоторой строки1 и те из них ,которые мне понравятся - загонять в строку2 . Заранее размер 2-ой строки я не знаю - она может оказаться очень большой - поэтому перед тем как добавить в неё понравившийся символ я увеличиваю её размерность на "1" . может я говорю о чём-то вроде -
Цитата:
Если ты хочешь, что бы память для следующего элемента выделялась по команде аля push_back и дописывалась в конец массива, то так делать нелья.
просто про push_back не слыхал )) могу ли я использовать realloc аналогично setlength ?
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 07.12.2010, 21:51   #7
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Операция выделения новой памяти или перенос уже выделенной памяти - ресурсоёмкая задача. Её нужно избегать. Если ты заранее не знаешь, сколько памяти нужно выделить, лучше посчитай в цикле и потом уже выдели.
nowaalex вне форума Ответить с цитированием
Старый 07.12.2010, 23:26   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
могу ли я использовать realloc аналогично setlength ?
в общем случае да.
Цитата:
в делфи есть
в Делфи в цикле менять длину строки тоже не стоит.
тем более скорее всего у нее есть св-во типа Capacity(св-во определяющее размер реально выделенной памяти(то есть выделяется чуть больше чем надо), тогда не каждое изменение её длины меняет реальный размер занимаемый в памяти.
Цитата:
Операция выделения новой памяти
вот она не очень ресурсоемкая, особенно для памяти из кучи.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.12.2010, 00:16   #9
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

если вам строку неопределенной длины считать - string вам в помощь, или, как вариант, некоторые товарищи используют указатель на char, я этого не использовал, не знаю )
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 08.12.2010, 02:06   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

kaljan775, и откуда ж в С классы то?

а насчет указателя так это обычный способ создания динамического массива.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив Golovastik Общие вопросы C/C++ 10 27.05.2010 20:36
Динамический массив supra89kren Общие вопросы C/C++ 4 25.03.2010 20:23
Динамический массив Lemo Помощь студентам 5 16.09.2009 06:26
Кэш память, или динамический массив? slips JavaScript, Ajax 1 07.09.2009 17:38
Динамический массив. Mickle Помощь студентам 9 21.06.2007 20:31