我正在尝试为3x3维数组中的每个索引赋值。我在开始时将所有值初始化为1,然后将index [0] [2]设置为2.但是,某种方式索引[1] [0]也附加到值2.然后我尝试设置[1] [2]到2,[2] [0]也设置为值2.我不确定这里发生了什么?
void magicSquare (int param){
//param = 3
int volume = param - 1;
int squareArray[volume][volume];
int c = 0;
int d = 0;
for (int i = 0; i < param*param; i++) {
squareArray[c][d] = 1;
c +=1;
if (c == param) {
d +=1;
c = 0;
}
}
squareArray[0][2]= 2;
c = 0;
d = 0;
printf (" %d | ",squareArray[c][d]);
for (int i = 1; i < param*param; i++) {
c +=1;
if (c == param) {
d +=1;
c = 0;
printf ("\n %d | ",squareArray[c][d]);
}
else printf (" %d | ",squareArray[c][d]);
}
答案 0 :(得分:3)
您将数组声明为2x2而不是3x3。
param-1
(3-1)被分配到volume
,因此被分配到2x2。数组从0
开始索引,在size-1
结束。声明数组时,声明大小,然后访问元素从0
到size-1
。
此外,您可以使用嵌套的c
循环,而不是使用d
和for
:
for(int i=0; i<param; ++i){ // will loop [0,param-1] or [0,param)
for(int j=0; j<param; ++j){ // same
arr[i][j] = 1;
}
}
编辑:我故意省略动态分配,因为OP显然是初学者。
答案 1 :(得分:1)
您正在访问squareArray
越界。而不是
int squareArray[volume][volume];
使用
int squareArray[param][param];
声明2D数组时
int array[M][N];
用于访问数组的索引的有效范围是:
array[0][0] .... array[M-1][N-1]
在您的情况下,param
为3.您正在声明一个大小为2 x 2
的数组。访问数组的有效范围索引是:
squareArray[0][0] .... squareArray[1][1]
在循环中:
for (int i = 0; i < param*param; i++) {
squareArray[c][d] = 1;
c +=1;
if (c == param) {
d +=1;
c = 0;
}
}
您访问的数组最多为squareArray[2][2]
。这本身就会导致不确定的行为。
<强>更新强>
感谢@MattMcNabb,我意识到这个问题已被标记为C ++。
int squareArray[param][param];
不是有效的C ++语句。必须将其更改为使用某种动态数组 - 例如std::vector
或std::array
。
您可以使用:
std::vector<std::vector<int>> squareArray(param, std::vector<int>(param, 0));
答案 2 :(得分:1)
如果你总是在编译时知道方块的尺寸,那么你可以写:
template<int param>
void magicSquare ()
{
int squareArray[param][param];
并保留其余代码。
但是,如果直到运行时才知道param
,那么这在标准C ++中不起作用。 (有些编译器允许扩展,但有充分理由避免使用此类扩展)。
没有太多细节,标准修复就是写:
vector< vector<int> > squareArray(param, vector<int>(param));
是的,这有点难看,但是您不必更改其余的代码。要启用此功能,您需要在文件顶部#include <vector>
,以及using std::vector;
,如果您还没有使用命名空间标准。