Talnos

Пользователь

Регистрация: 10.03.2019

Сообщения: 404

Рейтинг: 112

Talnos

Регистрация: 10.03.2019

Сообщения: 404

Рейтинг: 112

Как нужно вводить массив строк в Си? У меня вводится количество строк, а потом строки по одной, нужно это все запихать в массив.

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Статические: char str_arr[Y][X].

Например:

char str_arr[3][8] = {"str1\n\0\0\0", "str12\n\0\0", "str123\n\0"};


Динамические: объявляешь указатель на указатель char** и выделяешь память под каждый из указателей. Еще можно по-цыгански выделить один раз и распределить между тем что тебе надо, но тут свои подводные будут.

Например:

https://pastebin.com/xfQHrHnw


Никто не запрещает выделять разное количество памяти на каждую из строк.


Не забывай освобождать память. И магические константы лучше не используй, это я так, для примера. Если надо изменить длину - используй realloc. Надо чтобы память была инициализирована нулями - calloc.

Talnos

Пользователь

Регистрация: 10.03.2019

Сообщения: 404

Рейтинг: 112

Talnos

Регистрация: 10.03.2019

Сообщения: 404

Рейтинг: 112

Kagon сказал(а):

Статические: char str_arr[Y][X].

Например:

char str_arr[3][8] = {"str1\n\0\0\0", "str12\n\0\0", "str123\n\0"};


Динамические: объявляешь указатель на указатель char** и выделяешь память под каждый из указателей. Еще можно по-цыгански выделить один раз и распределить между тем что тебе надо, но тут свои подводные будут.

Например:

https://pastebin.com/xfQHrHnw


Никто не запрещает выделять разное количество памяти на каждую из строк.


Не забывай освобождать память. И магические константы лучше не используй, это я так, для примера. Если надо изменить длину - используй realloc. Надо чтобы память была инициализирована нулями - calloc.

Нажмите, чтобы раскрыть...

Спс

Bachgaman

Пользователь

Регистрация: 29.05.2017

Сообщения: 8164

Рейтинг: 5303

Bachgaman

Регистрация: 29.05.2017

Сообщения: 8164

Рейтинг: 5303

img
Kagon сказал(а):

Статические: char str_arr[Y][X].

Например:

char str_arr[3][8] = {"str1\n\0\0\0", "str12\n\0\0", "str123\n\0"};


Динамические: объявляешь указатель на указатель char** и выделяешь память под каждый из указателей. Еще можно по-цыгански выделить один раз и распределить между тем что тебе надо, но тут свои подводные будут.

Например:

https://pastebin.com/xfQHrHnw


Никто не запрещает выделять разное количество памяти на каждую из строк.


Не забывай освобождать память. И магические константы лучше не используй, это я так, для примера. Если надо изменить длину - используй realloc. Надо чтобы память была инициализирована нулями - calloc.

Нажмите, чтобы раскрыть...

а зачем все это какое практическое применение?

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Bachgaman сказал(а):

а зачем все это какое практическое применение?

Нажмите, чтобы раскрыть...


Ну, например, argv передается в программу как раз как массив строк, char** argv

Mirajana

Пользователь

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

Mirajana

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

img
Kagon сказал(а):


Ну, например, argv передается в программу как раз как массив строк, char** argv

Нажмите, чтобы раскрыть...

что там про выделение памяти? типо явно 10кб даешь программе или как? в жс такой наркомании нет

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7249

Mirajana сказал(а):

что там про выделение памяти? типо явно 10кб даешь программе или как? в жс такой наркомании нет

Нажмите, чтобы раскрыть...

argv ОС выделяет для пользовательской программы.

Да, берешь явно кусок памяти через аллокатор ОС или можешь свой аллокатор сделать, чего бы и нет. В жс нет, так как там уборщик мусора. Это делает jvm а не программист своими руками.

Mirajana

Пользователь

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

Mirajana

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

img
Kagon сказал(а):

argv ОС выделяет для пользовательской программы.

Да, берешь явно кусок памяти через аллокатор ОС или можешь свой аллокатор сделать, чего бы и нет. В жс нет, так как там уборщик мусора. Это делает jvm а не программист своими руками.

Нажмите, чтобы раскрыть...

pepejeez.png?1592046683

irqrk

Пользователь

Регистрация: 22.06.2015

Сообщения: 14933

Рейтинг: 3525

Нарушения: 100

irqrk

Регистрация: 22.06.2015

Сообщения: 14933

Рейтинг: 3525

Нарушения: 100

Mirajana сказал(а):

pepejeez.png?1592046683

Нажмите, чтобы раскрыть...

А оптимизицаю по-твоему как делать?

Или в тех же игрульках с открытым миром как хранить инфу о локациях, сколько памяти выделять на контент?

Поэтому-то то на жс не пишут тяжелый софт и игры.


Talnos сказал(а):

Спс

Нажмите, чтобы раскрыть...

Если ты не против видосов, на курсе CS50 это хорошо разжежывают.

Jaood

Пользователь

Регистрация: 09.09.2019

Сообщения: 3398

Рейтинг: 2051

Jaood

Регистрация: 09.09.2019

Сообщения: 3398

Рейтинг: 2051

Kagon сказал(а):

В жс нет, так как там уборщик мусора. Это делает jvm а не программист своими руками.

Нажмите, чтобы раскрыть...

В жс это делает движок написанный на плюсах HAhaa.png


irqrk сказал(а):

Если ты не против видосов, на курсе CS50 это хорошо разжежывают.

Нажмите, чтобы раскрыть...

Дельный совет, кста.

Удалено 535946

Пользователь

Регистрация: 13.04.2015

Сообщения: -25

Рейтинг: 6

Удалено 535946

Регистрация: 13.04.2015

Сообщения: -25

Рейтинг: 6

Kagon сказал(а):

Это делает jvm а не программист своими руками.

Нажмите, чтобы раскрыть...

jvm - это java, в js вроде как за это v8 отвечает.


Bachgaman сказал(а):

а зачем все это какое практическое применение?

Нажмите, чтобы раскрыть...

Чтобы писать нетребовательное ПО для умных тостеровPepeCoffee.png?1554727550

Crazy_Plinto

Пользователь

Регистрация: 09.01.2018

Сообщения: 8959

Рейтинг: 4060

Crazy_Plinto

Регистрация: 09.01.2018

Сообщения: 8959

Рейтинг: 4060

Kagon сказал(а):

Статические: char str_arr[Y][X].

Например:

char str_arr[3][8] = {"str1\n\0\0\0", "str12\n\0\0", "str123\n\0"};


Динамические: объявляешь указатель на указатель char** и выделяешь память под каждый из указателей. Еще можно по-цыгански выделить один раз и распределить между тем что тебе надо, но тут свои подводные будут.

Например:

https://pastebin.com/xfQHrHnw


Никто не запрещает выделять разное количество памяти на каждую из строк.


Не забывай освобождать память. И магические константы лучше не используй, это я так, для примера. Если надо изменить длину - используй realloc. Надо чтобы память была инициализирована нулями - calloc.

Нажмите, чтобы раскрыть...

На каком языке ты написал это? Я них.. фига не понял:D

Шаурма с Сыром

Пользователь

Регистрация: 06.04.2016

Сообщения: 2946

Рейтинг: 540

Шаурма с Сыром

Регистрация: 06.04.2016

Сообщения: 2946

Рейтинг: 540

irqrk сказал(а):

Или в тех же игрульках с открытым миром как хранить инфу о локациях, сколько памяти выделять на контент?

Нажмите, чтобы раскрыть...

Бггг, все там нормальный массив и все посчитано сколько данных хранит 1 куб.

Mirajana

Пользователь

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

Mirajana

Регистрация: 02.07.2012

Сообщения: 10571

Рейтинг: 6630

img
irqrk сказал(а):

А оптимизицаю по-твоему как делать?

Или в тех же игрульках с открытым миром как хранить инфу о локациях, сколько памяти выделять на контент?

Поэтому-то то на жс не пишут тяжелый софт и игры.


Если ты не против видосов, на курсе CS50 это хорошо разжежывают.

Нажмите, чтобы раскрыть...

хм откуда меня знать тогда сколько будет потреблять мой город с rtx лучами? :0