一个无用的声明如何影响这个C程序?

时间:2018-03-04 17:34:05

标签: c recursion

我编写了以下C程序,以使用递归查找给定数组的最大数量。该程序提供正确的输出。但是有一行代码(int x = 1;) 它在程序中没有任何作用,但如果我删除它,这个程序启动会给出错误的输出。我无法理解为什么?请解释

   #include<stdio.h>

  int largestElement(int ar[], int length,int i,int lar)
  {
      int largest, j;
      j=i;
      largest=lar;

    if(j<length)
    {


        if(ar[j]>ar[j+1])
        {

        ar[j+1]=ar[j];
        }

        largest=ar[j+1];
        largestElement(ar,length,i+1,largest);

        return largest;
    }

   printf("\nlargest number of array = %d ",largest);

    }

   int main()
  {
   int a[10]={2,22,87,1,9,99,11,90,1,0};// Given an array of 10 elements
   int x=1; //If I remove this statement the output is some random number
            //but if I keep this line I get correct output, despite the fact 
            // that x is of no use in this program.
   largestElement(a,10,0,0);
   return 0;
  }

1 个答案:

答案 0 :(得分:1)

如上所述,largestElement功能的问题在于您在条件if(ar[j]>ar[j+1])中调用未定义的行为,然后在ar[j+1]=ar[j]; j = 9中调用SEGFAULT {1}}因为您试图访问超出数组末尾的内存。这会在您的代码中调用未定义的行为,然后可以使其提供所需的结果或x=1;或其间的任何内容。

当您在数组后面声明一个额外的整数int x时,它的行为正确,这只是实现定义行为的副作用,其中附加整数x紧跟在提供的数组之后至少在额外定义的整数存储位上,可以使您免受即时SEGFAULT的影响。由于您通过交换元素来分配最大值,因此最大值可能会在#include <stdio.h> #include <limits.h> /* for INT_MIN */ int largestElement (int *ar, int length, int idx, int largest) { if (idx == length) /* recursion exit condition */ return largest; if (ar[idx] > largest) /* largest test */ largest = ar[idx]; /* recursive call */ return largestElement (ar, length, idx + 1, largest); } int main (void) { int a[10] = {2, 22, 87, 1, 9, 99, 11, 90, 1, 0}, largest = largestElement (a, 10, 0, INT_MIN); printf("\nlargest number of array = %d\n", largest); return 0; } 中结束,这就是删除它会改变输出的原因。 但这些都不是定义的行为,因此无法保证。

如果你想递归找到最大的数字,那么根本不要交换元素,只需返回最大的数字。简单的事情:

$ ./bin/arrlargestrecurse

largest number of array = 99

示例使用/输出

#include <stdio.h>
#include <limits.h>

int largestElement (int *ar, int length)
{
    int largest = INT_MIN;

    while (length--)
        if (ar[length] > largest)
            largest = ar[length];

    return largest;
}

int main()
{
    int a[10] = {2, 22, 87, 1, 9, 99, 11, 90, 1, 0},
    largest = largestElement (a, 10);

    printf("\nlargest number of array = %d\n", largest);

    return 0;
}

注意:没有必要使用递归方法开始,并且在程序解决方案随时可用的情况下不鼓励使用递归。为什么?每个递归调用都是一个单独的函数调用,系统必须为每个递归调用创建一个完整的函数堆栈。现在对于一个10元素阵列来说,它并不重要,但它可以快速增加百万个元素阵列或更多。一个简单的程序实现看起来像:

import csv, sqlite3,sys

con = sqlite3.connect('db.sqlite3')
cur = con.cursor()

query="""INSERT INTO adm_Appointment(sch_time, operation_id, surgeon, 
pat_name)
VALUES(%s,%s,%s,%s)"""


with open('dailypatientlist.csv','r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
next(reader)
for line in reader:
    elements="line[0],line[1],line[2],line[3]"
    cur.execute(query,(elements,))

con.commit()
con.close()

仔细看看,如果您有任何其他问题,请告诉我。