C ++为多维数组赋值

时间:2014-12-16 03:12:50

标签: c++ arrays multidimensional-array

我正在尝试为3x3维数组中的每个索引赋值。我在开始时将所有值初始化为1,然后将index [0] [2]设置为2.但是,某种方式索引[1] [0]也附加到值2.然后我尝试设置[1] [2]到2,[2] [0]也设置为值2.我不确定这里发生了什么?

1 | 2 | 1 | ----> 1 | 1 | 2 |

1 | 1 | 1 | ----> 1 | 1 | 1 |

2 | 1 | 1 | ----> 1 | 2 | 1 |

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]);

}

3 个答案:

答案 0 :(得分:3)

您将数组声明为2x2而不是3x3。

param-1(3-1)被分配到volume,因此被分配到2x2。数组从0开始索引,在size-1结束。声明数组时,声明大小,然后访问元素从0size-1

此外,您可以使用嵌套的c循环,而不是使用dfor

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::vectorstd::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;,如果您还没有使用命名空间标准。