#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int prime(long long int);
long long int *arr; //array to hold n prime numbers
int main()
{
int i,count=4;;
long long int n;
scanf("%lli",&n);
arr=malloc(sizeof(long long int)*n);
arr[0]=2;
arr[1]=3;
arr[2]=5;
arr[3]=7;
if (n==1) printf("%lli",arr[0]);
else{ if (n==2) printf("%lli",arr[1]);
else{ if (n==3) printf("%lli",arr[2]);
else{ if (n==4) printf("%lli",arr[3]);
else
{
for(i=2;count<n;i++)
{
if(prime(6*i-1)) { /*As prime nos are always 6k+1 or
arr[count]=6*i-1; 6k-1fork>=2 I checked only for those*/
count++; }
if(prime(6*i+1)&&count<=n) {
arr[count]=6*i+1;
count++; }
}
printf("%lli",arr[count]);
}}}}
//free(arr);
return 0;
}
int prime(long long int x)
{
int j=1,flag=1;
while(arr[j]<=sqrt(x))
{
if (x%arr[j]==0)
{
flag=0;
break;
}
j++;
}
return flag;
}
free(arr)
正在提供核心转储错误,因此存在一些与全局动态数组相关的故障。
问:这是声明全局动态数组的正确方法吗?这段代码中可能出现什么问题?
提前谢谢。答案 0 :(得分:3)
如果这是您的实际代码,则有4个错误:
count < n
而不是count <= n
,好像count == n
您无法写入arr[count]
arr[count]
arr[count-1]
这可能是您的意思arr[1]
,arr[2]
和arr[3]
可能超出范围在每次循环迭代中调用sqrt(x)
当然也是低效的,可能你应该在外面调用它,并且由于计算平方根的方式可能存在潜在的舍入问题错误,所以你可能更喜欢:
while( arr[j] * arr[j] < x )
最好不要将其设为全局并将其传递给您的函数。
最好将程序的主循环逻辑移到main()
之外。
我很惊讶你说你的节目适用于n = 1,2和3,因为它看起来像是你的界限。
答案 1 :(得分:2)
你的计数器超出了数组的大小。特别是对于i = 2,满足两个条件(6i-1和6i + 1),因此计数器递增两次,导致使用arr [5],其中你只在数组中分配了5个位置。这是因为您检查计数器&lt; = n而不是计数器
不确定这也可能是免费创建核心转储的原因,但这是可能的(因为一旦破坏了内存,free就可以访问损坏的数据)。