因为第二个程序不是在任何情况下都能返回正确的值,比如当前j的值是4的话,是一个偶数,显然在检查素数的循环中会提前break,但是此时不满足i==n的条件的,所以那个唯一的return就被跳过,但是此时函数已经运行到末尾,却没有发现有效的return语句,所以编译器就会默认将离末尾最近的那个return当作有效的返回语句并执行(而不管实际的程序逻辑是否允许它运行),所以,你的第二个程序参数无论是否是素数都会被返回,也就出现了bug
数组作为形参,实际上就是一个指针。int fun(int arr[])会被编译器处理成int fun(int *arr),而sizeof(一个指针),总是一个固定值(依据平台的不同,可能是4或8)。所以,你需要直接将数组的大小传进fun函数中,这样定义fun:
int fun(int arr[],int n)
{
//...
}
fun函数的参数arr是一个int指针而不是int数组,sizeof(arr)相当于sizeof(int*),sizeof(int*)/sizeof(int)结果是固定的,32位程序中为4/4=1,64位程序中为8/4=2。