Я не смог найти такой вопрос, как этот, но, пожалуйста, не стесняйтесь перенаправить меня к ответу, если он существует.
Ниже я приложил все усилия, чтобы повторить ошибку, с которой я столкнулся,с как можно меньшим количеством кода. Я удалил как можно больше переменных, сохраняя ошибку, и жестко закодировал значения, которые кажутся необходимыми для ее репликации;Я оставил только переменные, которые должны быть переменными, чтобы эта ошибка возникала в соответствии с моими тестами .Сначала я передаю значение 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, но я не знаю.Пожалуйста, дайте мне знать, если я могу дать какие-либо разъяснения.