以下程序打印介于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 在上面的例子中,但是如果我们在prime函数中删除printf语句中的注释并且输出正常的printf语句 1 2 3 5 7 这怎么可能?这里有什么错误?
我使用的编译器是linux平台中的GCC编译器。
答案 0 :(得分:3)
你的prime()
方法返回位于堆栈上的局部变量num
,因此在prime()
调用返回后它不在范围内(也就是无效)。
一些修复:
num
prime
静态
num
(记得释放它)num
传递给prime
方法。答案 1 :(得分:1)
您正在堆栈上分配一个int数组。所以当你return num;
它超出范围并且行为未定义时,因为指针变得无效而你破坏了堆栈。
您必须在main中分配数组,并将其传递给prime()
内的malloc()
或prime()
并返回,将其释放到main中。
答案 2 :(得分:0)
您正在将本地变量地址传递给main。这不是一个好习惯。局部变量的范围在该模块内。因此,您可以直接将数组传递给素数并直接处理结果。 注意:您的代码也可以在没有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;
}