2013-07-31 30 views
0

以下程序打印在1和10单个printf语句如何更改数组中的值?

#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语句输出是这怎么可能?这里有什么bug?

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

+2

不要忽视'警告:函数返回本地variable' –

+0

的地址,我得到了相同的代码预期的输出。它的未定义行为是因为你传递了局部变量地址。所以有时它会给出预期的输出,有时它不会。未定义的行为。 –

回答

3

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

一对夫妇修复:

  • 你也许能够使num静中prime
  • 你可以动态地分配num(记得要释放它)
  • 你可以通过numprime方法。
1

你正在堆栈上分配一个int数组。所以,当你return num;它超出了范围,行为是未定义的,因为指针变得无效,你破坏了堆栈。

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

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