2013-04-01 1 views
0

주어진 N (N < 4294967295) 아래의 소수를 인쇄하는 아래의 C 프로그램을 실행했습니다. SunOS에서 실행될 때 괜찮 았지만 우분투에서 실행될 때 (코어 덤프 된) 세그먼트 오류가 발생했습니다 (gcc 컴파일러로 컴파일 됨). 아무도 내가 잘못 된 곳을 알려주시겠습니까? SunOS의의 컴파일러 버전 아래에 언급 된 우분투 12.10우분투의 C 프로그램에서 런타임 오류가 발생했습니다. 하지만 잘 실행 SunOS

cc -V 

참조 : 일 C 5.9 SunOS_sparc 패치 124867-01 2007년 7월 12일

gcc -v 

내장 사양을 사용. COLLECT_GCC = gcc가 COLLECT_LTO_WRAPPER =는/usr/lib 디렉토리/GCC/x86_64에-리눅스 GNU/4.7/LTO-래퍼에게 대상 : x86_64에-리눅스 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 - 프로그램 접미사 = -4.7 - 사용 가능 공유 - 사용 가능 링커 빌드 ID --with-system-zlib --libexecdir =/usr/lib --without -libdir =/usr/lib --enable-nls --with-sysroot =/--included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/include/C++/-enable-clocale = gnu - 사용 가능 libstdcxx-debug - 사용 가능 libstdcxx-time = 예 - 사용 가능 -gnu-unique-object - 사용 가능 플러그인 - 사용 가능 -objc-gc - 사용 불가 -werror - with-arch-32 = i686 --with-tune = 일반 - 사용 가능 확인 = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu,363,210 스레드 모델 : POSIX 버전의 gcc 4.7.2 (우분투/리나 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

안녕하세요 @ 대니얼 피셔가 제안대로 시도했지만 실행 시간이 반으로 줄어 들었습니다. 감사합니다 –

답변

1
return(&a[0]); 

당신은 함수 후 존재하지 않는 지역 변수에 대한 포인터를 반환하고 보고.

경고가있는 gcc를 실행하면 컴파일러에서이를 알려야합니다.

2

prime_number 함수의 끝에서 prime_number 함수 자체 (의 스택)에 정의 된 변수에 대한 포인터를 리턴합니다. 함수가 존재할 때부터 스택의 내용물이 기화되어 잘못된 포인터를 반환하게됩니다.

물론, 실행중인 시스템, OS 등에 따라 스택의 내용이 즉시 덮어 쓰여지지 않았을 수도 있고 짧은 시간 동안 유효 할 수도 있지만 이것은 운이 좋을 것입니다.

반환 결과를 mallocing하거나 호출자에게 해방하거나 prime_number 함수에 배열을 전달하십시오. 이렇게하면 내용은 발신자에게 유효합니다.

+0

솔라리스 머신을 돌릴 때 그 이유가있을 수 있습니다. 나는 mallocing을 시도 할 것이다. 감사. –