我对多维数组中的值变化感到有点疯狂,即使赋值似乎没有发生。我正在开发一个程序来查找两个字符串之间最长的公共(public)子序列。为此,我创建了一个数组,其维度是相应字符串的长度。我将数组的第一行和第一列初始化为零,但由于某种原因 arr[2][0]
变成了 1
。当 j=0
和 k=5
时,这发生在外部 for 循环的第一次迭代中。
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
string a = "bird";
string b = "turdbi";
int aLen = a.length();
int bLen = b.length();
int arr[aLen][bLen];
//initializing the multidimensional array
for (int i=0;i<aLen;i++){
arr[i][0]=0;
}
for (int i=0;i<bLen;i++){
arr[0][i]=0;
}
int subsequence=0;
for (int j=0;j<aLen;j++){ //(0,0) is the leftmost corner of the table, to compensate for additional row/col
for(int k=0;k<bLen;k++){
if (a.at(j)==b.at(k)){
subsequence = arr[j][k]+1; //add one to upper diagonal
}
else {
subsequence = max(arr[j+1][k],arr[j][k+1]); //find max value from adjacent cells'
}
//how does arr[2][0] ==1??
arr[j+1][k+1]=subsequence;
}
cout << endl;
}
return 0;
}
最佳答案
评论基本都说了。当您对 j < aLen 和 k < bLen 的限制时,当您执行 j + 1 和 k + 1 时,您的索引超出范围。
至于为什么会这样,数组在内存中是保证顺序存储的。因此,当您创建一个数组 -> int a[2][3] 时,您在内存中创建的就是这个。
0 - a[0][0] -
1 - a[0][1] |--- a[0] == &a[0][0] (same type, same value)
2 - a[0][2] -
3 - a[1][0] -
4 - a[1][1] |--- a[1] == &a[1][0] (same type, same value)
5 - a[1][2] -
&a[0][0], &a[0][1], &a[0][2], &a[1][0]... 是指向 int 的指针。 因此,每次第二个下标递增(在您的情况下为 k),我们都会将指针值递增 sizeof(int)。
&a[0] 和 &a[1] 是指向 3 个整数数组的指针。 意思是,每次第一个下标递增(在您的情况下为 j),我们都会将指针值递增 sizeof(int) * 3,因为我们将地址偏移 3 个整数。
因此,通过执行 a[0][4],我们将编辑 a[1][1] 中的值。在后端,下标运算符只是编译器为您生成偏移量。
关于c++ - 是什么导致这个数组值改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50054500/