2013-04-01 66 views
0

我執行了下面的C程序,它在給定的N(N < 4294967295)下打印一個素數。它在SunOS中執行時效果不錯,但是在Ubuntu中運行時(使用gcc編譯器編譯它),我得到Segmentation fault(核心轉儲)。任何人都可以讓我知道我出錯的地方。提到SunOS中的編譯器版本以下和Ubuntu 12.10在Ubuntu的C程序運行時錯誤。但執行SunOS

cc -V 

CC:化Sun C 5.9 SunOS_sparc補丁124867-01 2007/07/12

gcc -v 

使用內置的規格。 COLLECT_GCC = GCC COLLECT_LTO_WRAPPER =/usr/lib中/ GCC/x86_64的-Linux的GNU/4.7/LTO-包裝 目標:x86_64的-Linux的GNU 配置有:../src/configure -v --with-pkgversion ='Ubuntu/Linaro 4.7.2-2ubuntu1'--with-bugurl = file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages = c,C++,go,fortran,objc ,obj-C++ --prefix =/usr --program-suffix = -4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir =/usr/lib --without -included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/include/C++/4.7 --libdir =/usr/lib --enable -nls --with-sysroot =/- -enable-clocale = gnu --enable-libstdcxx-debug --enable-libstdcxx -time = yes --enable-gnu-unique-object --enable-plugin --enable -objc -gc --disable-werror - with-arch-32 = i686 --with-tune = generic --enable-checking = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu 線程模型:POSIX gcc版本4.7.2(Ubuntu的/ Linaro的4.7.2-2ubuntu1)

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<inttypes.h> 

int main() 
{ 
FILE *fpin,*fpout; 
char ch[11], file_name[100]; 
long long int num1=0,i,tmp=0; 
long long int *arr; 

printf("enter file name:: "); 
gets(file_name); 

fpin = fopen(file_name,"r"); 
fpout = fopen("/home/code/output.c","w"); 

while(1) 
{ 
fgets(ch,11,fpin); 
if (!feof(fpin)) 
{ 
    num1=atoll(ch); 

    arr = prime_number(num1); 

    for(i=0;*(arr+i)!='\0';i++) 
     { 
     fprintf(fpout,"%llu",*(arr+i)); 
     if(*(arr+i+1) == '\0') 
      fputc('.',fpout); 
     else 
      fputc(',',fpout); 
     } 

} 
else 
{ 
    fclose(fpin); 
    fclose(fpout); 
    break; 
} 
} 

} 

prime_number(long long int n) 
{ 
    long long int i,j,total=0,a[200]; 
    int count=0; 

    printf("\n%llu \n",n); 

    for (j=2;j<=n;j++) 
    { 
    count = 0; 
    for (i=1;i<=j;i++) 
     {`enter code here` 
     if ((j%i) == 0) 
      count++; 

     if (count > 2) 
      break; 
     } 
    if (count==2) 
     { 
      a[total] = j; 
      total++; 
     } 
    } 
return(&a[0]); 
} 
+0

除了返回一個局部變量的地址之外,'a [200]'有點小以存儲素數在任何非平凡的範圍內。而你的主要測試效率非常低下(儘管你一旦發現第三個除數就「破」了,這是一個好的開始)。除了平方根之外,合數的最小素因數不能超過平方根。 –

+0

嗨@DanielFischer按照您的建議嘗試,執行時間縮短一半。謝謝 –

回答

1
return(&a[0]); 

你返回一個指針到一個局部變量,這不你的函數存在後回報。

如果你用警告運行gcc,你的編譯器應該告訴你這一點。

2

在您的prime_number函數結束時,您將返回一個指向在prime_number函數本身(的堆棧中)中定義的變量的指針。由於該函數存在時,其堆棧的內容會被有效地揮發,您將返回一個無效的指針。

當然,根據您運行的是什麼系統,操作系統等,堆棧的內容可能沒有被立即覆蓋,並且會在短時間內出現有效,但這只是運氣。

嘗試mallocing返回結果(並釋放您的調用者),或將數組傳遞給prime_number函數。這樣,內容對於主叫方而言仍然有效。

+0

可能是因爲我在solaris機器上運行時遇到了一些垃圾數據。我會嘗試mallocing。謝謝。 –