LINUX.ORG.RU

О несимметричных массивах


0

0

Поспорили с однокурсником о том, как должен вести себя компилятор С 
при таком коде:

int a[][] = {
   {1,2,3,4},
   {2,6},
   {7,8)  
};

Он утверждает, что компилятор должен создать несимметричный двумерный 
массив с длинами подмассивов 4, 2 и 2. Я же стою на том, что компилятор
должен ругаться на такое либо делать массив одномерным, потому что 
это чревато ошибками. Ибо тогда при каждом переборе придется отслеживать
длину каждого массива.

Ну и вообще, просветите, пожалуйста, насколько оправдано использование
несимметричных массивов. И в каких случаях стоит это делать?
anonymous

>Ну и вообще, просветите, пожалуйста, насколько оправдано использование несимметричных массивов. И в каких случаях стоит это делать?

Массив строк, например аргументов командной строки и т.п. А вообще лучше юзать одномерные массивы.

wfrr ★★☆
()

Ну, тут ещё надо наверное указывать язык, на C# в таком или подобном виде должно это работать.

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

> А сам чего не попробуешь? gcc даст ошибку error: array type has incomplete element type.

Спасибо, просто gcc под рукой нету.

> Ну, тут ещё надо наверное указывать язык, на C# в таком или подобном виде должно это работать.

Я имел ввиду C. С C# и Java все понятно, комплилятор прожуёт.

Тут вопрос несколько более обший. Вот с GOTO понятно, что применять следует только при освобождении кусков памяти где-нибудь в ядре при ошибке внутри одной функции. А вот помимо массивов строк, как верно подметил wfrr, я никак не могу придумать реальную ситуацию, где такие массивы удобно пользовать. И не бояться при этом отстрелить себе ногу.

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

> я никак не могу придумать реальную ситуацию, где такие массивы удобно пользовать. И не бояться при этом отстрелить себе ногу.

А зачем отстреливать себе ногу? Можно просто использовать.

Legioner ★★★★★
()

> Он утверждает, что компилятор должен создать несимметричный двумерный массив с длинами подмассивов 4, 2 и 2. Я же стою на том, что компилятор должен ругаться на такое либо делать массив одномерным

в Си все массивы подобного вида одномерны. Просто компилятор знает размер строки и заменяет автоматом a[i][j] на a[i*N+j]

массивы указателей (строк) это уже другое.

dilmah ★★★★★
()

Правильный ответ: такая конструкция в языке си не разрешена.
Все массивы в си всегда одномерны (т.к. кусок памяти с указателем на первый элемент). Для развертывания обращения
к многомерному массиву в арифметику с указателями компилятору надо знать размер по всем измерениям кроме первого.
Если при инициализации задано меньше элементов чем длина массива, то остальные элементы считаются нулями.

Т.е. в вашем случае надо делать так:

int a[][4] = {
   {1,2,3,4},
   {2,6},
   {7,8}
};

Это создаст многомерный массив 3x4, у которого недостающие элементы будут заполнены нулями
(но помним, что с ним можно работать как с одномерным).

Прочитайте хотя бы это: http://www.opennet.ru/docs/RUS/bogatyrev/gl_2.html

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