О двумерных массивах в C -> Являются ли array [1] [0] и array [0] [1] одинаковыми? - PullRequest
0 голосов
/ 07 мая 2011
int main ()
{
    int arr[10][1];
    arr[1][0]=44;
    arr[0][1]=55;
    printf("%i",arr[1][0]);
    return 0;
}

Должно ли это распечатать "55" или "44" ???

Ответы [ 2 ]

4 голосов
/ 07 мая 2011

Нет такого элемента, как 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 может выбрать заполнение пространства между «строками» массива из-за проблем с выравниванием.Это дезинформация;ни один стандарт С не говорит, что это возможно.

1 голос
/ 07 мая 2011

Нет, они не одинаковы.Вы объявили массив из десяти массивов каждый с одним целочисленным элементом.arr[0][1] больше индекса вашего массива, поэтому должна быть ошибка.Результат должен быть 44.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...