【问题标题】:runtime error (SIGSEGV)运行时错误 (SIGSEGV)
【发布时间】:2010-04-22 10:02:30
【问题描述】:

我很高兴知道为什么我在 codechef.com 中遇到问题 http://www.codechef.com/problems/AXR1P2 时出现此错误,而我的代码是...

#include<stdio.h>
#include<stdlib.h>
int main()
{
int *num=0,n=0,i=0,max=0;char *s="";
int sum[9]={1,5,14,20,25,31,32,38,39},dsum[9]={1,7,8,14,19,25,26,32,33},unitdig=0;
do
{
  gets(s);
*(num+i)=(int)atoi(s);
i++;
}while(*s!='#');
max=i;
for(i=0;i<max-1;i++)
{
 n=*(num+i);
 if(n>10)
  unitdig=33*(n/10-1)+39+dsum[(n%10)-1];
 else
  unitdig=sum[(n%10)-1];
   printf("%d\n",unitdig%10);
}
 getchar();
return 0;}

【问题讨论】:

  • 未来,如果您在将代码转储到此处之前先尝试自行调试,我们会更容易帮助您(也更容易帮助您自己)。您应该(在副本中,将原始文件备份在某处)消除代码,直到您缩小导致错误的原因,然后尝试找出错误发生的原因。我们可以通过这种方式更快、更彻底地为您提供帮助。
  • 如果源代码至少经过格式化,这对于回答您的问题的人也将非常有帮助

标签: c segmentation-fault


【解决方案1】:

几个错误:

char * s = "";
...
gets(s);

你正试图读入一个字符串文字,你想要:

char s[SOMESIZE];

而且你还没有初始化 num 指向任何东西,所以在:

*(num+i)=(int)atoi(s);

您正在取消引用一个空指针。可能还有其他问题 - 这是我(几乎)立即发现的两个问题。

【讨论】:

  • 我个人认为段错误来自gets(s),但这也很糟糕。
  • @Chris 是的,我在点击发送按钮后立即发现了这一点。
  • 另请注意,OP 应该从不使用gets()
【解决方案2】:

您有一个不指向已分配空间的 int 指针 (num)。对该指针的任何访问都将导致意外行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多