C:功能参数输入看似随机变化

时间:2018-09-24 03:17:15

标签: c arrays function memory-management double

我现在还找不到这样的问题,但是请随时将我重定向到答案(如果存在)。

下面,我将尽力以最少的代码复制遇到的错误。 在保留错误的同时,我删除了尽可能多的变量,并对复制它所需的值进行了硬编码;根据我的测试,我只剩下必须为该错误发生的变量。首先,我传递一个值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中的函数调用和临时变量有关的事情非常语义化,但我不知道。请让我知道是否可以澄清。

1 个答案:

答案 0 :(得分:2)

此代码具有未定义的行为:

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

循环执行一次,i为12。但是数组的长度为1,因此写操作超出范围。