Массивы, указывающие на один и тот же блок памяти в c ++?

У меня странная проблема. У меня есть следующий кусок кода на 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 меняется и как я могу предотвратить это.

Может ли кто-нибудь объяснить мне, почему это происходит?

Спасибо!

2

Решение

Ваш код имеет неопределенное поведение. Рассмотрим, что происходит внутри следующего цикла, когда 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?

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector