单个printf语句如何更改数组中的值?

时间:2013-07-31 05:07:17

标签: c printf

以下程序打印介于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编译器。

3 个答案:

答案 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;
}