C: Ввод параметров функции кажется случайным - PullRequest
0 голосов
/ 24 сентября 2018

Я не смог найти такой вопрос, как этот, но, пожалуйста, не стесняйтесь перенаправить меня к ответу, если он существует.

Ниже я приложил все усилия, чтобы повторить ошибку, с которой я столкнулся,с как можно меньшим количеством кода. Я удалил как можно больше переменных, сохраняя ошибку, и жестко закодировал значения, которые кажутся необходимыми для ее репликации;Я оставил только переменные, которые должны быть переменными, чтобы эта ошибка возникала в соответствии с моими тестами .Сначала я передаю значение epsilon, double со значением 1.0/3.0.Затем я передаю это a_function, что занимает epsilon и некоторые массивы.Я выполняю базовое копирование частей входных массивов, после чего epsilon меняет значение очень незначительно.Ниже приведен фрагмент кода, где я удалил объявления и include операторы.

int main(int argc, int argv[])
{
  /* It doesn't matter what these arrays are filled with, 
     but they must be of length 13 */
  int array1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int array2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int array3[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int array4[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int a_value = 2;
  double a_double= 1.0/3.0;

  printf("a_double: %.10lf\n", a_double);
  a_function(array1, array2, array3, array4, a_value, a_double);
  return 0;
}

void a_function(int *array1, int *array2, int *array3, int *array4,  
                int a_value, double a_double)
{
  int m = 1;
  /* This occurs regardless of value assigned to m (provided the 
     for loop is appropriately changed to not go out of bounds) */
  int temp_array1[m];  
  int temp_array2[m];
  for(int i = 12; i < 13; i++)
  {
    temp_array1[i] = array1[i];
    temp_array2[i] = array2[i];
  }

  printf("a_double: %.10lf\n", a_double);
}

Запуск этого кода дает вывод

$ ./a.out
a_double: 0.3333333333
a_double: 0.3333332539

Кажется, что ошибка не возникаеткогда:

  • Длина массивов изменяется.
  • Условие завершения цикла for изменяется на что-то отличное от последнего элемента (например, i < 12 не делаетрезультат в ошибке).
  • Любой из включенных параметров удаляется.
  • Когда значение m жестко закодировано: не имеет значения, какое значение m,но если массивы определены в терминах этого, возникает ошибка.
  • Когда я запускаю этот код непосредственно в main (то есть без функции).
  • Когда у меня есть первый printf из a_double при входе в функцию (т. Е. Непосредственно перед int m = 1).

Что может быть причиной этой ошибки?Я предполагаю, что это что-то очень семантическое связано с вызовом функций и временными переменными в C, но я не знаю.Пожалуйста, дайте мне знать, если я могу дать какие-либо разъяснения.

1 Ответ

0 голосов
/ 24 сентября 2018

Этот код имеет неопределенное поведение:

  int m = 1;
  int temp_array1[m];  
  for(int i = 12; i < 13; i++)
  {
    temp_array1[i] = array1[i];
  }

Цикл выполняется один раз, с i равным 12. Но длина массива равна 1, поэтому запись выходит за пределы.

...