C++给多维数组赋值

3

我正在尝试为我的3x3维数组中的每个索引分配值。一开始,我将所有值初始化为1,然后将index[0][2]设置为2。但是,不知何故,index[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]);

}

你为什么在for循环中使用if语句而不是嵌套的for循环来分配数组? - Masked Man
“int squareArray[volume][volume];”(变长数组)不是标准的C++语法,只能通过扩展来支持。请使用“std::vector”代替。 - Captain Obvlious
3个回答

3
你将数组声明为2x2而不是3x3。
参数1(3-1)被赋值给volume,因此是2x2的。 数组从0开始索引,并在size-1结束。 声明数组时,你需要先声明大小,然后从0到size-1访问元素。
此外,你可以使用嵌套的for循环来代替c和d:
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显然是初学者。


好的,那就是我对C++数组的误解了。现在它运行得很好。还有感谢嵌套的for循环! - aDev
你正在使用C数组。C++有STL(标准库)用于容器,如数组、列表、队列等。未来你会看到它们,它们更方便易用,因此你不必再费心手动进行边界检查等任务。不客气:)继续努力,多写程序! - Varaquilex

1
您正在访问超出边界的 squareArray。请改为
int squareArray[volume][volume];

使用
int squareArray[param][param];

当您声明一个二维数组时:
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));

数组从索引0开始。这就是为什么我使用volume = param - 1的原因。 - aDev
这在标准的C++中是无效的。 - M.M
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - R Sahu
这是否意味着 int squareArray[param][param] 只能在 param 固定且定义于程序开头时使用,无法作为函数参数调用? - aDev

1

如果你在编译期间始终知道正方形的尺寸,那么可以编写如下代码:

template<int param>
void magicSquare ()
{
    int squareArray[param][param];

并且保留您的代码中的其余部分。

然而,如果param直到运行时才知道,则在标准C++中无法工作。(一些编译器允许使用扩展,但有很多理由避免使用此类扩展)。

不想深入细节,标准解决方法是编写:

    vector< vector<int> > squareArray(param, vector<int>(param));

是的,这有点丑陋,但这样你就不必改变代码的其余部分。要启用此功能,您需要在文件顶部添加#include <vector>,并且如果您尚未使用命名空间std,则还需要添加using std::vector;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接