我编写了以下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;
}
答案 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()
仔细看看,如果您有任何其他问题,请告诉我。