【问题标题】:Getting a SIGSEGV run time error despite initialization and proper bounds?尽管有初始化和适当的界限,但仍出现 SIGSEGV 运行时错误?
【发布时间】:2014-07-08 15:29:59
【问题描述】:

我对hackerearth上http://www.hackerearth.com/problem/golf/minimal-combinatorial/description/问题的解决方案:

#include <stdio.h>
signed long long int fn(int,int);
int main()
{ 
 int t=0,n=0,r=0,i=1;
 signed long long int c=0;
 scanf("%d",& t);
 for(i=1;i<=t;i++)
   {
     scanf("%d",&n);
     scanf("%d",&r);
     c=fn(n,r);
     printf("%lld\n",c);

   }
}

signed long long int fn(int n,int r)
{
 if (r==1)
   return n;
 else if (r==0)
   return 1;
 else return (fn(n-1,r)+fn(n-1,r-1));
}

【问题讨论】:

  • 不,它没有,它读取正确的整数(scanf 使用“%d”作为格式说明符)
  • 为什么将rn 声明为数组,但只使用它们的索引0?
  • 如果您使用scanf 而不是错误检查,如何确保正确的界限?
  • @Fiddling 抱歉找不到你(我的意思是数组边界,现在我已经删除了数组)
  • @user3632784 抱歉。您(曾经)依赖用户输入数组中的元素数量并使用这个未经过滤的数字。这可能会导致访问数组边界之外的内存。

标签: c combinations


【解决方案1】:

由于无限递归而导致分段错误,请确保递归函数中的停止条件涵盖所有情况。

您可以在调试器中查看发生了什么,或者只需打印fn() 开头的两个参数即可。

【讨论】:

  • 是的。修复损坏的代码后,我在这里遇到堆栈溢出。
【解决方案2】:

还有:

scanf("%d",n);
scanf("%d",r);

应替换为:

scanf("%d",&n);
scanf("%d",&r);

scanf 期望 指针 指向扫描值应该去的变量,而不是值本身。

【讨论】:

  • 哎呀!感谢您指出这一点。但在计算 100c10 时仍然显示相同的错误。
猜你喜欢
  • 2014-08-21
  • 2023-03-17
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2021-04-24
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多