我遇到了关于const多维数组的问题。
这是我的代码:
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
最后一行给出了这个错误:
BitboardChess.exe中的0x00007FF77B8839C6抛出异常: 0xC0000005:访问冲突读取位置0x0000000000000000。
如果存在此异常的处理程序,则程序可能是安全的 继续进行。
我做错了什么?请帮忙!
答案 0 :(得分:3)
const int* arr[3][3] = { a, b, c };
分配了一个指向ints
(int *
)的指针数组,并初始化前三个位置,数组衰减为指向int
的指针。
一击到
cout << *arr[1][0] << endl;
你已经用完了你个人初始化的数组元素,并试图取消引用零初始化指针 - 一个NULL指针。
如何解决:
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;
答案 1 :(得分:1)
您基本上只填充arr
的第一行。表达式a
等同于&a[0]
,同样适用于数组b
和c
。您可以像这样初始化arr
:
const int* arr[3][3] = { a, b, c };
但是,这会将a
,b
和c
解释为单独的const int*
,而不是整行(const int
的数组)。剩下的元素被初始化,好像它们具有静态存储持续时间并指向null。