我在c程序中遇到运行时错误(SIGSEGV)

时间:2014-08-02 14:25:13

标签: c runtime-error

为什么我在以下代码中遇到运行时错误(SIGSEGV):

#include<stdio.h>
#include<string.h>
int main()
{
    int t_line,count[10000],i;
    scanf("%d",&t_line);

    for(i=1;i<=t_line;i++)
    {
        fflush(stdin);
        gets(t);
        count[i]=(int)t[0]+(int)t[1]+(int)t[2];
    }

    for(i=1;i<=t_line;i++)
        printf("%d\n",count[i]);

    return 0;
}

我还试图通过初始化数组的所有元素来解决这个问题。

1 个答案:

答案 0 :(得分:1)

我想知道如何编译代码,而不声明变量t。但是,仍然唯一缺少的元素是:char t[your choice of size];。除此之外

#include<stdio.h>
//#include<string.h> No need of this header,a s you are not using any string functions
int main()
{
    int t_line,count[10000],i;
    char t[64];//you need to declare the variable before using it
    scanf("%d",&t_line);

    //Its safer if you check this
    if(t_line >= 10000)//if you use 0 and < t_line in for loop below then change the condition to:  if(t_line > 10000)
    {
       printf("ERROR: Limit exceeded. Not enough memory.\n");
       return 1;//or you could use exit(1); and #include <stdlib.h> 
    }

    for(i=1;i<=t_line;i++)//suggested: for(i=0;i<t_line;i++) 
    {
        //fflush(stdin);
        //gets(t);
        char *rc = fgets(t, sizeof(t), stdin);
        if(rc != NULL)
        {   t[strlen(t) - 1] = '\0';\\because fgets gets the \n  into the string too. This line makes fgets similar to gets, improving safety from overflow.
        }
        else
        {
             // handle fgets failed error
        }
        count[i]=(int)t[0]+(int)t[1]+(int)t[2];
    }

    for(i=1;i<=t_line;i++)//suggested: for(i=0;i<t_line;i++)
        printf("%d\n",count[i]);

    return 0;
}

找到解决方案并建议内联更改为代码注释。

在C中,最好使用从0开始的索引,除非有特定要求使用其他值。