C застрял внутри для цикла

#c

#c

Вопрос:

Итак, вот мой код

 int find_h(int i, int j, int current[N 1][N], int goal[N 1][N])
{
  int sum=0;
  int a, b;
  int cp[N*3], gp[N*3];
  for(a=0;a<N;a  )
  {
    for(b=0;b<N;b  )
    {
      cp[4*a b]=current[a][b];
      gp[4*a b]=goal[a][b];
      printf("b = %dn", b);
    }
    printf("n");
  }
  return sum;
}
 

N = 4, а current и goal заполняются числами от 0 до 15 включительно, появляясь только один раз каждое.

Он отлично выполняет первые 3 итерации (до a = 3), но затем продолжает выводить b = 0 навсегда.

Спасибо

Комментарии:

1. для чего используются cp и gp? кажется, сумма никогда не вычисляется

Ответ №1:

Я думаю, что ваш цикл перезаписывает память. если N = 4, то вы выделяете cp [12] и gp [12]. Тем не менее, когда a = 3 cp[4 * a b] и gp [4 * a b] оба являются [12], что превышает конец массива

Ответ №2:

Я не знаю, что вы хотите сделать, но я вам кое-что скажу: cp и gp слишком малы. Как написано, они должны быть большими N * N вместо N * 3 (== 12).

Теперь, здесь cp[4*a b] вы должны были написать N*a b . Если N == 4 тогда это то же самое. В противном случае…

И это не ясно: int current[N 1][N] это будет (с N == 4 ) элементом массива 20. Затем вы копируете линеаризованный массив N * N элементов (или, возможно N * 3 , см. Выше)…

Комментарии:

1. Ах! Спасибо! Я забыл изменить это, когда тестировал

2. Чтобы было ясно, почему это превратилось в бесконечный цикл, вполне вероятно, что либо cp[13] или gp[13] на самом деле указывало на b (потому что это произошло сразу после этого массива в памяти), и current[3][1] или goal[3][1] было 0 , поэтому он продолжал устанавливать b значение 0 неочевидным образом. Определенно неопределенное поведение.

Ответ №3:

Одна из проблем заключается в том, что cp и gp слишком малы. Вы присваиваете элементам с индексами до 4*(N-1) (N-1) , но массивы имеют 3*N длину только элементов.

Когда вы записываете дальше конца массива, поведение вашей программы не определено.

Ответ №4:

Похоже, вы переполняете буферы cp и gp. Вы должны выделять для них 4 * N места, а не 3 * N. Можете ли вы попробовать это изменить? Я бы так и сделал, но я далеко от своего компьютера.