Нет такого элемента, как arr[0][1]
- так же, как нет элемента arr[10][0]
- индексы массива начинаются с нуля.
Если вы объявляете:
int arr[10][2];
Ваш код будет работать так, как вы хотели.
С объявлением
int arr[10][1];
при доступе к arr[0][1]
вы получаете доступ за концом первого массива "строки".Доступ к памяти в C не проверяется, поэтому ваш доступ имеет псевдоним элемента, хранящегося в arr[1][0]
.
Если вы поменяли местами порядок двух операторов присваивания, вы увидите, что отображаемое значение зависит от порядка этихдва задания.Позднее назначение записывает значение из более раннего назначения.Т.е.:
int main ()
{
int arr[10][1];
arr[0][1]=55;
arr[1][0]=44;
printf("%i",arr[1][0]);
return 0;
}
... будет печатать 44, просто потому, что это будет окончательное значение, записанное в это пятно целого размера в памяти.
РЕДАКТИРОВАТЬ: потому что у нас так много людейкомментируя здесь, утверждая, что интерпретирует паршивый стандарт C99 как объявление поведения, которое вы вызвали, как «неопределенное поведение» ... Учтите, что следующий код делает то же самое, что и выше, из-за раздела 6.5.2.1:
int main(int argc, char *argv[])
{
int arr[10][1];
arr[1][0] = 44;
arr[0][1] = 55;
printf("Value is: %d\n", 0[arr][1]);
return 0;
}
В связанном вопросе было заявлено, что компилятор C может выбрать заполнение пространства между «строками» массива из-за проблем с выравниванием.Это дезинформация;ни один стандарт С не говорит, что это возможно.