从const多维数组中复制/读取值

时间:2016-10-17 21:02:25

标签: c++ arrays

我遇到了关于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。

     

如果存在此异常的处理程序,则程序可能是安全的   继续进行。

我做错了什么?请帮忙!

2 个答案:

答案 0 :(得分:3)

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

分配了一个指向intsint *)的指针数组,并初始化前三个位置,数组衰减为指向int的指针。

一击到

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

你已经用完了你个人初始化的数组元素,并试图取消引用零初始化指针 - 一个NULL指针。

如何解决:

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

(但我不确定这会给你想要的方向)和

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

或者放弃abc并一次性初始化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],同样适用于数组bc。您可以像这样初始化arr

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

但是,这会将abc解释为单独的const int*,而不是整行(const int的数组)。剩下的元素被初始化,好像它们具有静态存储持续时间并指向null。