【问题标题】:Run time error in C program in ubuntu. But executed in well SunOSubuntu 中 C 程序的运行时错误。但在 SunOS 中执行得很好
【发布时间】:2023-03-16 00:55:01
【问题描述】:

我执行了下面的 C 程序,它打印低于给定 N (N

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-wrapper 目标: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。错误 --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]);
}

【问题讨论】:

  • 除了返回局部变量的地址之外,a[200] 有点小,可以存储任何非平凡范围内的素数。而且您的主要测试效率极低(尽管您在找到第三个除数后就break,这是一个好的开始)。只除平方根,合数的最小素数除数不能超过平方根。
  • 嗨@DanielFischer按照您的建议进行了尝试,执行时间减少了一半。谢谢

标签: c gcc segmentation-fault sunos


【解决方案1】:

在 prime_number 函数结束时,您将返回一个指向在 prime_number 函数本身(堆栈)中定义的变量的指针。因为当函数存在时,它的堆栈内容被有效地蒸发了,所以你返回了一个无效的指针。

当然,取决于您正在运行的系统、操作系统等,堆栈的内容可能不会立即被覆盖,并且会在短时间内有效,但这只是运气。

尝试分配返回结果(并与调用者一起释放),或将数组传递给 prime_number 函数。这样,内容对调用者仍然有效。

【讨论】:

  • 这可能是我在 solaris 机器上运行时得到一些垃圾值的原因。我会尝试mallocing。谢谢。
【解决方案2】:
return(&a[0]);

您正在返回一个指向局部变量的指针,该指针在您的函数返回后不存在。

如果您运行 gcc 时出现警告,您的编译器应该会告诉您这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多