在c ++中指向同一块内存的数组?

时间:2013-01-19 18:40:58

标签: c++ arrays memory memory-management dynamic-programming

我有一个奇怪的问题。我在C ++中有以下代码:

int grid[h][w]; int dp[h][w]; int p[h][w];

for(int y = 0; y < h; y++)
    for(int x = 0; x < w; x++)
        cin >> grid[y][x];

// base case
for(int y = 0; y < h; y++) dp[y][0] = grid[y][0];


// fill rest
for(int x = 1; x < w; x++)
{
    for(int y = 0; y < h; y++)
    {
        dp[y][x] = min(dp[y][x-1], min(dp[(y-1)%h][x-1], dp[(y+1)%h][x-1])) + grid[y][x];
    }
}

cout << "dp: " << endl;
for(int y = 0; y < h; y++) cout << dp[y][w-1] << endl;

正如你所看到的,在最后几行我打印dp数组的最后一列(我感兴趣的是)。当我添加以下语句时,就在//基本情况下:

p[0][0] = 3;

我的dp阵列发生了变化,我不知道为什么。我只添加了那个语句,我想知道为什么dp数组正在改变以及我如何防止这种情况。

有人可以向我解释为什么会这样吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

您的代码有未定义的行为。考虑y = 0

时在以下循环中发生的情况
for(int y = 0; y < h; y++)
{
    dp[y][x] = min(dp[y][x-1], min(dp[(y-1)%h][x-1], dp[(y+1)%h][x-1])) + grid[y][x];
                                   ^^^^^^^^^^^ out of bounds since -1%h equals -1

您的意思是说(y+h-1)%h而不是(y-1)%h吗?