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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2012, 14:12   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию память под массив

Здравствуйте. Необходимо динамически выделять память под определенный размер строки, считываемой с файла.

Код:
char *s;
fgets(s,1024,file);
Такой вариант неправильный? Создан просто указатель s, без определения объема памяти.

Даже если предположим, что строки не длиннее 1024 байт, можно вначале считать строку в массив размером 1025 байт, затем узнать размер строки, и выделить уже память под хранение этой строки:

Код:
char *str;
char str_temp[1024];
...
... // считали данные в str_temp
...
str = calloc(strlen(str_temp)+1,sizeof(char));
strcpy(str,str_temp);
Правильно ли так?
Артэс вне форума Ответить с цитированием
Старый 15.09.2012, 14:52   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Такой вариант неправильный? Создан просто указатель s, без определения объема памяти.
Угу, только без выделения памяти.

Цитата:
можно вначале считать строку в массив размером 1025 байт, затем узнать размер строки, и выделить уже память под хранение этой строки
Зачем еще раз память выделять? У вас же уже считана строка.

Вместо strcpy лучше использовать более защищенные варианты с контролем буфера.
p51x вне форума Ответить с цитированием
Старый 15.09.2012, 15:13   #3
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Так если выделено столько же памяти, сколько необходимо строке, чем strcpy опасен?

Просто, есть массив строк, например 1000 строк. Вместо выделения одинаковой памяти для всех строк 1024 байт на 1000 строк, я хочу выделять определенное кол-во памяти под каждую строку, в зависимости от ее размеров. А для индексации строк использовать массив указателей

Код:
char *str[1000];
...
str[x] = calloc(); // и так далее, в цикле
...
Так ведь правильнее? чем делать массив 1024 x 1000 "char str[1024][1000];" где будет много пустой памяти из-за разной длины строк.

Последний раз редактировалось Артэс; 15.09.2012 в 15:17.
Артэс вне форума Ответить с цитированием
Старый 15.09.2012, 16:04   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Не факт. Выделить 1 Мб ОЗУ и бегать по смежным адресам лучше, чем прыгать по указателям в разные области ради экономии нескольких байт.

Но все зависит от задачи...
p51x вне форума Ответить с цитированием
Старый 15.09.2012, 16:58   #5
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Хм даже так.. вообщем я пишу свой скриптовый интерпретатор, и мне надо хранить в памяти значения, которые задаются переменным в скрипте. Собственно в скрипте я могу устанавливать значение строк. Строк может быть много, и все разной длины, от нескольких байт, до килобайт (например 15 000 символов, или 30 000 символов). Собственно, в скрипте, при обращении к переменной, интерпретатор будет искать переменную с именем, и выдавать эти данные (строки).

Строка может быть короткой, 100-200 символов, а может быть и длинной, 50 000 символов.. мне тогда ставить лимит на 124 000 байт? Огромный массив получается для 1000 строк, char str[124000][1000]; потому и подумал про массив указателей, и разное выделение памяти.
Артэс вне форума Ответить с цитированием
Старый 15.09.2012, 17:55   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
мне тогда ставить лимит на 124 000 байт?
Откуда такая цифра? В килобайте не столько байт. Итак, у вас интерпретатор... наверное, каждая переменная суть структура "данные, тип_переменно,..", так зачем еще какой-то массив?

П.С. На тему компиляторов/интерпретаторов/разбора написано много умных книг и статей можно по ним посмотреть еще идеи.
p51x вне форума Ответить с цитированием
Старый 15.09.2012, 22:32   #7
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

124000 это так, для примера. Ну можно взять 100 000 символов макс.

Можно конечно и структуру делать, но первая задумка была из двух массивов для хранения строк.

Первый массив например char name[128][1000]; который содержит названия переменных, а второй массив char data[102400][1000]; который содержит данные переменных.

Делая структуру, как Вы предложили, будет ситуация, похожая на массив указателей - только массив структур. И мол, переход от области к области через массив указателей, требовательнее к ресурсам... но если сравнивать массив указателей, и массив 102400 на 1000, то указатели выигрывают?

Про совет почитать литературу на тему интерпретаторов - это понятно. Но что скажете на счет данной ситуации? Выгоднее массив указателей, чем большущий массив с пробелами?

Последний раз редактировалось Stilet; 16.09.2012 в 22:06.
Артэс вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить выделена ли память под объект Sibedir Общие вопросы Delphi 58 21.03.2011 11:48
Выделить память под структуру. ХреновыйПрогер Общие вопросы C/C++ 9 26.12.2010 19:00
Heap Corruption при попытке перевыделить память под массив внутри структуры Farrel Общие вопросы C/C++ 1 21.04.2010 00:45
В конструкторе выделяется память под массив. Как быть с перегрузкой оператора = ? TwiX Общие вопросы C/C++ 6 15.12.2009 12:18
Память, выделяемая под приложение. Altera Компоненты Delphi 4 30.11.2008 18:13