是什么导致此数组值发生变化?

时间:2018-04-27 02:50:43

标签: c++ arrays

我对多维数组中的值更改感到有点疯狂,即使分配似乎没有发生。我正在研究一个程序来找到两个字符串之间最长的公共子序列。为此,我创建了一个数组数组,其维数是相应字符串的长度。我将数组的第一行和第一行初始化为零,但由于某种原因,arr[2][0]变为1。这在j=0k=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;
}

1 个答案:

答案 0 :(得分:2)

评论基本上都说了这一切。当j +的极限值

至于它为什么会发生,保证数组按顺序存储在内存中。因此,当您创建一个数组时 - &gt;在[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] -

&amp; a [0] [0],&amp; a [0] [1],&amp; a [0] [2],&amp; a [1] [0] ...是指向int的指针。 因此,每次第二个下标递增时(在您的情况下为k),我们将指针值增加sizeof(int)。

&amp; a [0]和&amp; a [1]是指向3个整数的数组的指针。 意思是,每当第一个下标递增时(在你的情况下为j),我们将指针值增加sizeof(int)* 3,因为我们将地址偏移3个整数。

因此,通过执行[0] [4],我们将编辑[1] [1]中的值。在后端,下标运算符只是为您生成偏移量的编译器。