【问题标题】:Segmentation fault in scanning long long int in C [duplicate]在C中扫描long long int时出现分段错误[重复]
【发布时间】:2017-04-05 08:07:10
【问题描述】:

我正在尝试编写一个简单的程序来计算两个数字的公因数。我在扫描第二个数字时遇到了分段错误(核心转储)。我不明白故障在哪里?

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

int main()
{
long long int first,second,t,k;
long long int i,count=0;
scanf("%lld",&first);
scanf("%lld",&second);
//storing the lowest of two numbers in t  
if(first<second){
    t=first;
}
else{
    t=second;
}
//initialising an array to be used as flags
int com[t];
for(i=0;i<t;i=i+1){
    com[i]=1;
}
for(i=0;i<t;i=i+1){
    if(com[i]==1){
        if(first%(i+1)==0&&second%(i+1)==0){
            count=count+1;
        }
        else{
            for(k=2;k*(i+1)-1<t;k=k+1){
                com[k*(i+1)-1]=0;
            }
        }
    }
}
printf("%lld\n",count);
 return 0;
}

【问题讨论】:

  • 这不是您的错误所在 (case and point)。未定义的行为在其他地方。检查scanf 的返回值,它始终是亲属!
  • 您提供什么输入?您如何确认分段错误发生在扫描过程中而不是之后?
  • 我通过将 printf 语句贯穿始终检查了我的代码,并确认它确实在第二个 scanf 语句处停止。
  • @DavidSchwartz 如果数字超过 6 位,第二个 scanf 将不起作用。具体你可以试试这个 123456789 9876543
  • 这是堆栈溢出,当您尝试在堆栈上分配太多内存时,这里会发生int com[t];

标签: c segmentation-fault long-long


【解决方案1】:

我怀疑您的输入是一个非常大的数字(编辑:您在评论中确认了它)。调用栈的大小相当有限,声明一个巨大的变长数组很容易溢出。

int com[t]; 替换为以下内容:

int *com = malloc(sizeof *com * t);

当然,完成后不要忘记释放它。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多