LINUX.ORG.RU

Как на С динамически выделить память для двумерного массива char


0

0

Вот небольшой код, который выделяет статически память под 2-х мерный массив char.

int n;
char v[][10]={«green»,«red»,«blue»};
for(n=0;n<3;n++)
printf(«%s\n»,v[n]);

Печатает
green
red
blue

Как сделать тоже самое, но память выделять под массив функцией malloc?
Нужно следующее
1.   Определить указатель на двумерный массив char, без выделения памяти на сам массив
2.   Выделить память под 2-х мерный массив функцией malloc
3.   Обратится к элементам массива через указатель.


Ответ на: комментарий от anonymous

>И использование при изменении каждого символа в «потокобезопасной» строке проверки флагов с блокировкой шины является накладными расходами.

Вы не понимаете о чем пишете. Что есть следствие того что у Вас каша в голове вызванная сиплюсплюсом головного мозга.

Давайте так: приведите юз-кейс сценария в котором Вам понадобилось бы изменить какой-то символ в строке.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Жабизм головного мозга не менее опасен. Лечите свою кашу в голове.

Речь ведь шла про потокобезопасные строки? Один поток пишет в некоторые символы строки в разных местах сразу { a[i] = x; a[i+j] = y; } . Другой поток использует всю строку в цельном виде, не частично изменённую.

Для реализации такой стратегии в С++ (или в паскале или где угодно ещё) достаточно завернуть в мьютекс эти 2 участка кода. Будет это string или vector или char[1000] или map.

А в Жабе это можно сделать по другому?? StringBuilder и блокировки единственный способ обеспечить такое. Остаьные объекты будут тормозами. Потому что использовать для вышеупомянутого критического кода обязательно надо критические секции и мьютексы. «Потокобезопасные» String и StringBuffer кроме тормозов тут ничего не дадут. Или будет жрать ресурсы на копии в String или будет 2 лишних раза проверять флаги с блокировками шины в StringBuffer. И все остальные места программы вынуждены будут работать с этим StringBuilder.

anonymous
()
Ответ на: комментарий от anonymous

>Один поток пишет в некоторые символы строки в разных местах сразу { a[i] = x; a[i+j] = y; } . Другой поток использует всю строку в цельном виде, не частично изменённую.

Какую конкретно задачу решает эта композиция потоков оперирующая на расшаренном стринге?

Absurd ★★★
()
Ответ на: комментарий от Absurd

А это не конкретная задача? Предельно понятное описание. Однако ответов про приемущества «потокобезопасных» жабовых строк для решения такой задачи не последовало. Как и технического описания реализации мьютексов без системных вызовов в потоках 1:1 Линукса.

anonymous
()
Ответ на: комментарий от anonymous

>А это не конкретная задача? Предельно понятное описание.

При решении какой задачи возникает необходимость из одного потока модифицировать char'ы в стринге в то время как она читается другим потоком? Я знаю паттерн «Blackboard», но там данные висящие на блэкборде должны быть read-only. Атомарно взял данные с блэкборда - неатомарно клонировал - неатомарно изменил - атомарно обновил блэкборд. Но это не проясняет зачем нужно менять стринги: для этого нужен искусственный интеллект, т.к стринги вносятся в программу человеком и предназначены для прочтения их другим человеком. Для того чтобы убрать источник стрингов (первого человека) по большому счету нужен AI (если отбросить конечно примитивные утилиты форматирования типа snprintf). Вы часом не пишете AI?

Absurd ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.