<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Массив строк неизвестной длины</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html</link>
    <description>Доброго времени суток.&lt;br&gt;Нужно описать массив неизвестного количества строк неизвестной длины в Си.&lt;br&gt;&lt;br&gt;Пока имею следующее решение (код примерный, так как он на рабочем компе)&lt;br&gt;/* Глобальная переменная*/&lt;br&gt;char *mass&#091;&#093;;&lt;br&gt;&lt;br&gt;/* Функция, генерирующая новую строку в массиве*/&lt;br&gt;int new_mass_str(char* str, int num)&lt;br&gt;&#123;&lt;br&gt;    mass&#091;num&#093; = (char *)malloc(sizeof(str));&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Работает до 432 malloc&apos;a, на 433 выпадает с сегфаултом.&lt;br&gt;Что-то мне подсказывает, что фейл в объявлении глобальной переменной, но как ее по другому объявить - ума не приложу. И почему-то всегда именно 433-е выделение памяти (запись 433 строки) сегфолтит.&lt;br&gt;&lt;br&gt;Подробное описание задачи:&lt;br&gt;Используется inotify для слежением за директориями. Пишу рекурсивное наблюдение с помощью ftw(). Так как inotify не возвращает полный путь до файла, а только имя файла и номер дескриптора слежения&#091;wd&#093;, где произошли изменения, то приходится писать массив путей, скоррелированный с дескрипторами наблюдения (что-то вроде path&#091;wd&#093;).&lt;br&gt;Если есть какие-то еще варианты - буду рад</description>

<item>
    <title>Массив строк неизвестной длины (Andrey)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#13</link>
    <pubDate>Sat, 29 Sep 2012 14:55:33 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; mass нулем и обработку  ошибок уже сделал (с работы нет постоянного &lt;br&gt;&amp;gt; доступа, поэтому тут набегами =) ) &lt;br&gt;&amp;gt; вот  с добавлением кусками проблема. ftw() идет вниз по дереву иерархии &lt;br&gt;&amp;gt; и возвращает имена файлов и директорий. каждую директорию я сразу же &lt;br&gt;&amp;gt; начинаю отслеживать inotify&apos;ем, и поэтому сразу добавляю ее в массив по &lt;br&gt;&amp;gt; номеру дескриптора. пока быстродействие инициализации не критично. когда доделаю полный &lt;br&gt;&amp;gt; функционал, там уже оптимизировать начну.&lt;br&gt;&amp;gt; спасибо за помощь &lt;br&gt;&lt;br&gt;Вам бы врачем работать или адвокатом. Много, умно, и не по теме (это про массив строк неизвестной длины).&lt;br&gt;&lt;br&gt;ЗЫ Прочитал название темы, на полке прямо передо мной Хээфилд и проч. лежит. Последнее сообщение просто убило. Ну, понятно, что если бы всю тему прочитал, то наверное понял бы. Но тут слишком эээ... &quot;жесть&quot;...&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (trmt)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#12</link>
    <pubDate>Tue, 25 Sep 2012 15:12:18 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; Еще бы: &lt;br&gt;&amp;gt; 1. Инициализировать mass нулем.&lt;br&gt;&amp;gt; 2. Проверять ошибки.&lt;br&gt;&amp;gt; 3. Реаллок делать не для каждой строки, а память добавлять кусками, допустип, &lt;br&gt;&amp;gt; сторок по 256.&lt;br&gt;&amp;gt; 4. Вместо глобальных переменных использовать статическую структуру внутри функции.&lt;br&gt;&amp;gt; ...&lt;br&gt;&amp;gt; То уже почти библиотечная реализация.&lt;br&gt;&amp;gt; А если в задаче разрешено использовать C++, то в stl можно найти &lt;br&gt;&amp;gt; почти готовое решение.&lt;br&gt;&lt;br&gt;mass нулем и обработку  ошибок уже сделал (с работы нет постоянного доступа, поэтому тут набегами =) )&lt;br&gt;вот  с добавлением кусками проблема. ftw() идет вниз по дереву иерархии и возвращает имена файлов и директорий. каждую директорию я сразу же начинаю отслеживать inotify&apos;ем, и поэтому сразу добавляю ее в массив по номеру дескриптора. пока быстродействие инициализации не критично. когда доделаю полный функционал, там уже оптимизировать начну.&lt;br&gt;&lt;br&gt;спасибо за помощь&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#11</link>
    <pubDate>Tue, 25 Sep 2012 15:06:18 GMT</pubDate>
    <description>В догонку.&lt;br&gt;Непонятно, зачем передавать функции номер строки, если есть глобальный счетчик.&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#10</link>
    <pubDate>Tue, 25 Sep 2012 14:56:44 GMT</pubDate>
    <description>&amp;gt; Спасибо Анониму за подробное описание фейлов.&lt;br&gt;&lt;br&gt;Правильное восприятие критики обнадеживает.&lt;br&gt;&lt;br&gt;&amp;gt; Где-то я опять закосячил?&lt;br&gt;&lt;br&gt;На этот раз практически все верно, если я чего не пропустил.&lt;br&gt;Еще бы:&lt;br&gt;1. Инициализировать mass нулем.&lt;br&gt;2. Проверять ошибки.&lt;br&gt;3. Реаллок делать не для каждой строки, а память добавлять кусками, допустип, сторок по 256.&lt;br&gt;4. Вместо глобальных переменных использовать статическую структуру внутри функции.&lt;br&gt;...&lt;br&gt;То уже почти библиотечная реализация.&lt;br&gt;&lt;br&gt;А если в задаче разрешено использовать C++, то в stl можно найти почти готовое решение.&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (trmt)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#9</link>
    <pubDate>Tue, 25 Sep 2012 07:48:57 GMT</pubDate>
    <description>Спасибо Анониму за подробное описание фейлов.&lt;br&gt;как я понял, закосячил я в выделении памяти под массив указателей. &lt;br&gt;Нужно в mass выделять память для указателей, а уже в mass&#091;X&#093; выделять память под строку.&lt;br&gt;Итог получился такой.&lt;br&gt;&lt;br&gt;char** mass;&lt;br&gt;int mass_cnt = 1;    // количество строк (указателей)&lt;br&gt;...&lt;br&gt;int new_mass_str(char* str, int num)&lt;br&gt;&#123;&lt;br&gt;    if (mass == NULL)&lt;br&gt;    &#123;&lt;br&gt;         mass = (char**) malloc(mass_cnt*sizeof(char *));&lt;br&gt;    &#125;&lt;br&gt;    else&lt;br&gt;    &#123;&lt;br&gt;        mass = (char**)realloc(mass, ++mass_cnt*sizeof(char *));&lt;br&gt;    &#125;&lt;br&gt;    ...&lt;br&gt;    mass&#091;num&#093; = (char *)malloc(strlen(str)+1); // вот тут я в предыдущем варианте опечатался&lt;br&gt;                                               // strlen конечно же&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Работает, памяти жрет намного меньше (для 715 строк уменьшение почти в 9 раз).&lt;br&gt;&lt;br&gt;Где-то я опять закосячил?&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#8</link>
    <pubDate>Mon, 24 Sep 2012 18:35:24 GMT</pubDate>
    <description>&amp;gt; оказалось все просто и логично.&lt;br&gt;&lt;br&gt;Оно точно работает?&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#7</link>
    <pubDate>Mon, 24 Sep 2012 16:39:04 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;     else &lt;br&gt;&amp;gt;     &#123; &lt;br&gt;&amp;gt;         mass_size = mass_size + &lt;br&gt;&amp;gt; strlen(str); &lt;br&gt;&amp;gt;         mass = (char**)realloc(mass, mass_size); &lt;br&gt;&amp;gt;     &#125; &lt;br&gt;&amp;gt;     ...&lt;br&gt;&amp;gt;     mass&#091;num&#093; = (char *)malloc(sizeof(str)); &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; оказалось все просто и логично.&lt;br&gt;&lt;br&gt;Ваше первое решение было бессмыссленным&lt;br&gt;char *mass&#091;&#093;; - в области статитеских данных компилятор определил указатель на массив разменом в один элемент. При этом, скорее всего, выдал предупреждение, которое вы проигнорировали.&lt;br&gt;после этого mass&#091;1&#093; уже обращается к мусору. Удивительно, что программа вообще как-то работала.&lt;br&gt;Вам бы помогло &lt;br&gt;char (*mass)&#091;&#093;; или char **mass;&lt;br&gt;но этом случае память нужно выделять и под сам mass, и под стороки.&lt;br&gt;&lt;br&gt;Во втором случат память вы выделяете дважды и к мусору (в том случае, если длины строк больше длин указателей) не обращаетесь, но программа тем не менее абсолютно безграмотна, так как при коротких строках может выдать тот же сегментэйшин фаулт, а при длинных выделяет памяти почти вдвое больше, чем нужно.&lt;br&gt;&lt;br&gt;С</description>
</item>

<item>
    <title>Массив строк неизвестной длины (trmt)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#6</link>
    <pubDate>Mon, 24 Sep 2012 14:14:06 GMT</pubDate>
    <description>&amp;gt; И что самое весёлое - абсолютно неправильно. Впрочем запусти да и увидишь &lt;br&gt;&amp;gt; :)&lt;br&gt;&lt;br&gt;ну по крайней мере дерево из 700+ каталогов, то есть 700+ строк в массив записалось, прочиталось.&lt;br&gt;при нужде удалилось, добавилось. без ошибок и каких-либо видимых косяков.&lt;br&gt;может стоит все же подробнее описывать, в чем человек не прав, а не строить из себя &quot;мистер_я_лучше_Вас&quot;? Уж простите. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Массив строк неизвестной длины (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9547.html#5</link>
    <pubDate>Mon, 24 Sep 2012 04:45:54 GMT</pubDate>
    <description>&amp;gt; оказалось все просто и логично.&lt;br&gt;&lt;br&gt;И что самое весёлое - абсолютно неправильно. Впрочем запусти да и увидишь :)&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
