Копирование / считывание значения из постоянного многомерного массива

#c #arrays

#c #массивы

Вопрос:

У меня возникла проблема с постоянными многомерными массивами.

Это мой код:

 const int a[3] = { 1,2,3 };
const int b[3] = { 4,5,6 };
const int c[3] = { 7,8,9 };
const int* arr[3][3] = { a, b, c };
cout << *arr[0][0] << endl;
cout << *arr[0][1] << endl;
cout << *arr[0][2] << endl;
cout << *arr[1][0] << endl; // error
  

Последняя строка выдает мне эту ошибку:

Исключение, вызванное 0x00007FF77B8839C6 в BitboardChess.exe : 0xC0000005: местоположение чтения 0x0000000000000000 с нарушением доступа.

Если для этого исключения есть обработчик, программа может быть безопасно продолжена.

Что я делаю не так? Пожалуйста, помогите!

Комментарии:

1. почему вы смешиваете массивы int с массивами int* ?

2. arr[0][0] есть a , arr[0][1] есть b и arr[0][2] есть c . Вы ничего не установили arr[0][2] .

Ответ №1:

 const int* arr[3][3] = { a, b, c };
  

Выделил массив указателей на ints ( int * ) и инициализировал первые три местоположения с массивами, разложенными на указатели на int .

Как только вы нажмете

 cout << *arr[1][0] << endl;
  

У вас закончились элементы массива, которые вы лично инициализировали, и вы попытались разыменовать указатель с нулевой инициализацией — нулевой указатель.

Как решить:

 const int* arr[3] = { a, b, c };
  

(Но я не уверен, что это даст нужную ориентацию) и

 cout << arr[0][0] << endl;
  

Или отбросить a , b c и инициализировать 2D-массив одним выстрелом.

 const int arr[3][3] = {{ 1, 4, 7 },
                       { 2, 5, 8 },
                       { 3, 6, 9 }};
  

(или, может быть

 const int arr[3][3] = {{ 1, 2, 3 },
                       { 4, 5, 6 },
                       { 7, 8, 9 }};
  

потому что я все еще не уверен, какую ориентацию вы ищете) и

 cout << arr[0][0] << endl;
  

Ответ №2:

По сути, вы заполняете только первую строку arr . Выражение a эквивалентно amp;a[0] , то же самое относится к массивам b и c . Вы инициализируете arr так:

 const int* arr[3][3] = { a, b, c };
  

Но это интерпретирует a , b и c как отдельные const int* s, а не как целые строки (массив const int ). Остальные элементы инициализируются так, как если бы они имели статическую продолжительность хранения и указывали на null .