![](/img/trans.png)
[英]Logical error on assigning a char to a multidimensional char array on C++
[英]C++ assigning value to multidimensional array
我正在嘗試為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]);
}
您將數組聲明為2x2而不是3x3。
param-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顯然是初學者。
您正在訪問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));
如果你總是在編譯時知道正方形的維度,那么你可以寫:
template<int param>
void magicSquare ()
{
int squareArray[param][param];
並保留其余的代碼。
但是,如果直到運行時才知道param
那么這在標准C ++中不起作用。 (有些編譯器允許擴展,但有充分的理由避免使用此類擴展)。
沒有太多細節,標准修復就是寫:
vector< vector<int> > squareArray(param, vector<int>(param));
是的,這有點難看,但是你不必改變你的其余代碼。 要啟用此功能,您需要在文件的頂部, #include <vector>
,並using std::vector;
如果你還沒有使用namespace std。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.