86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
|
|||||||||||
1 | |||||||||||
Создание двумерного массива16.03.2017, 00:55. Показов 14155. Ответов 11
Метки нет (Все метки)
Здравствуйте! Столкнулся с такой проблемой: как правильно создать двумерный массив в Си? Все, что ни пытался найти - все ведет на с++, но никак ни на си. Поясню, мне нужно создать массив по такому принципу:
Просто я всегда делал массивы в си таким образом:
0
|
16.03.2017, 00:55 | |
Ответы с готовыми решениями:
11
Создание двумерного массива с элементами, зависящими от размера массива. Создание двумерного массива в программе Создание двумерного динамического массива Динамическое создание двумерного массива |
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||
16.03.2017, 02:44 | 2 | ||||||||||
Сообщение было отмечено paskalnikita как решение
Решение
Нет, не будет, ибо
N и M должны быть константами времени компиляции. Таким образом создается "статический массив". Если такой массив создается в функции -- он создается на стеке.Так Вы создавали "динамический массив". Он располагается в куче. Про стек и кучу почитайте, если не ознакомлены. Узнаете много чего интересного К вопросу: Объявляем статический массив (когда размерность известна нам):
1
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
|
16.03.2017, 04:47 | 3 |
В принципе да, но не на всех компиляторах поддерживается(на gcc прокатит, а VS, вроде, не умеет VLA). П.С. лучше unsigned или size_t для размерностей указывать.
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
||||||
16.03.2017, 07:03 | 4 | |||||
Сообщение было отмечено paskalnikita как решение
Решение
Именно в С: да, будет. При условии что общий размер массива не является слишком большим для локальной переменной.
Но даже и в этом случае у вас будет вариант
В случае локального массива - нет, в языке С такого требования нет.
4
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|
16.03.2017, 16:50 | 5 |
0
|
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
|
||||||
17.03.2017, 18:56 [ТС] | 6 | |||||
TheCalligrapher, сделал так как Вы посоветовали, только проблема в том, что я не могу присвоить значения элементам массива. Делаю я это так:
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
|||||||||||||||||||||
17.03.2017, 19:20 | 7 | ||||||||||||||||||||
Если массив выделялся как
1
|
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
|
|
21.06.2017, 13:05 [ТС] | 8 |
Скажите, для такого варианта :
есть что-нибудь вроде аналога? Поясню, сегодня узнал, что такой вариант выделения памяти не самый хороший. То есть, в таком случае выделяется память в которой есть указанное количество слотов памяти, а не так, что ищется много случайных свободных слотов. То есть есть память 00000 я выделил два слота для нее и в таком случае выделяется два последовательных слота памяти типа так --000 и это не очень правильно, так как не факт что есть такая длинная последовательность слотов памяти и лучше сделать что-то вроде такого: 0-0-0 или 00-0- и тд. Надеюсь понятно написал. Поправьте если не прав. Добавлено через 5 минут и это вариант тоже аналогичен тому, что выше
0
|
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
|
|
21.06.2017, 13:16 | 9 |
Память (виртуальная) всегда выделяется одним куском, никаких случайных слотов
1
|
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
|
|
21.06.2017, 13:21 [ТС] | 10 |
Вы уверены? нет такого, что есть самый оптимальный вариант выделения памяти? Нет такого, что функция malloc ищет первый свободный слот потом второй,третий и тд.? Есть ли подтверждение тому, что Вы пишете? Желательно на английском. Просто сегодня преподавать в университете сказал, что я не оптимально выделю память и лучше выделять по-другому и рассказал мне про способ, что я описал выше.
0
|
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
|
|
21.06.2017, 13:38 | 11 |
A single call to malloc allocates a contiguous chunk of heap space of the passed size
https://www.cs.swarthmore.edu/... rrays.html Добавлено через 12 минут Без всяких ссылок же должно быть понятно, маллок выделяет кусок памяти и присваивает указателю адрес начала этого куска. Определенно это должен быть один кусок, а как иначе. В физической памяти он может быть раскидан по разным фреймам, но это никак не контролируется юзером
1
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|
21.06.2017, 18:42 | 12 |
paskalnikita, возможно, Ваш преподаватель говорил о таком понятии как списки, просто Вы не так его поянли.
0
|
21.06.2017, 18:42 | |
21.06.2017, 18:42 | |
Помогаю со студенческими работами здесь
12
Создание двумерного массива в функции Создание двумерного динамического массива в функции Не работает динамическое создание двумерного массива Динамическое создание двумерного массива символов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |