#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 .