0

以下程序打印 1 到 10 之间的质数。

#include <stdio.h>
int* prime(int x,int y,int* range);

void main()
{
    int *x,s=10;
    int i=0; 
    x=prime(1,10,&s);

    for(i=0;i<s;i++)
    {
        printf("%d\n",x[i]);
    }


}
int* prime(int x,int y,int *range){

    int num[100],i,j,flag,inc=0;

    for(i=x;i<=y;i++)
    {
        flag=1;
        for(j=2;j<=(i/2);j++)
        {
            if(i%j == 0)
                flag=-1;
        } 
        if(flag==1)
        {

            num[inc]=i;
            inc++;
        }

    }
    *range=inc;
    //printf("$$%d$$",*range);
    return num;
}

在上述情况下,输出为 1 2 3 5 0,但如果我们在素数函数中删除 printf 语句中的注释并按照正常的 printf 语句给出输出为 1 2 3 5 7 这怎么可能?这里有什么错误??

我使用的编译器是linux平台的GCC编译器。

4

3 回答 3

3

您的方法返回位于堆栈上的prime()局部变量,因此在调用返回后它不在范围内(又名无效)。numprime()

几个修复:

  • 你也许可以numprime
  • 你可以动态分配num(记得释放它)
  • 你可以传入numprime方法。
于 2013-07-31T05:10:00.580 回答
1

您正在堆栈上分配一个 int 数组。因此,当您return num;超出范围并且行为未定义时,因为指针变得无效并且您破坏了堆栈。

您必须在 main 中分配数组并将其传递给prime()malloc()在其中prime()返回,然后在 main 中释放它。

于 2013-07-31T05:12:18.913 回答
0

您正在将局部变量地址传递给主变量。这不是一个好习惯。局部变量的范围在该模块内。因此,您可以直接将数组传递给素数并直接处理结果。 注意:您的代码在没有 printf 的情况下也可以完美运行。未定义的行为。

#include <stdio.h>
void prime(int x,int y,int* range, int * arr);
void main()
{
    int n[10],s=10;
    int i=0; 
    prime(1,10,&s,n);
    for(i=0;i<s;i++)
    {
        printf("%d\n",n[i]);
    }
}
void prime(int x,int y,int *range,int *arr)
{
    int i,j,flag,inc=0;
    for(i=x;i<=y;i++)
    {
        flag=1;
        for(j=2;j<=(i/2);j++)
            if(i%j == 0) flag=-1;
        if(flag==1) *(arr+inc++)=i;
   }
   *range=inc;
}
于 2013-07-31T06:03:28.143 回答