我现在还找不到这样的问题,但是请随时将我重定向到答案(如果存在)。
下面,我将尽力以最少的代码复制遇到的错误。 在保留错误的同时,我删除了尽可能多的变量,并对复制它所需的值进行了硬编码;根据我的测试,我只剩下必须为该错误发生的变量。首先,我传递一个值epsilon
,一个值为double
的{{1}}。然后,将其传递给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
之前)。此错误可能是什么原因?我的猜测是与C中的函数调用和临时变量有关的事情非常语义化,但我不知道。请让我知道是否可以澄清。
答案 0 :(得分:2)
此代码具有未定义的行为:
int m = 1;
int temp_array1[m];
for(int i = 12; i < 13; i++)
{
temp_array1[i] = array1[i];
}
循环执行一次,i
为12。但是数组的长度为1,因此写操作超出范围。