【问题标题】:Segmentation fault in C program on first scanf line第一个scanf行上的C程序中的分段错误
【发布时间】:2015-08-15 19:48:42
【问题描述】:

我在 scanf 将时间作为输入的行上遇到分段错误(我使用 gdb 和其他工具检测到它)这可能是什么原因?同样,当我省略整个 while 循环时,分段错误就会消失。如果我违反了论坛规则,我很抱歉,我是新来的

   #include<stdio.h>
   #include<stdlib.h>
   #define DOWN 2
   #define UP 1

int time;
 struct cave
{ 
    long up;
    long down;
};

 int main()
{ //write(1,"h",1);

scanf("%d",&time);

while(time--)
{ 

    int flag=0;
    long n,h,i;
    long count=0;
    scanf("%ld %ld",&n,&h);
    struct cave o[1000000];
    for(i=0;i<n;i++)
    {
        scanf("%ld",&(o[i].down));
        scanf("%ld",&(o[i].up));
    }
    long countup[1000000]={0};
    long countdown[1000000]={0};
    long upi,downi;
    for(i=0;i<n;i++)
    {
        upi=o[i].up;
        downi=o[i].down;
        countup[upi]++;
        countdown[downi]++;
    }
    long maxup=0;
    long maxupindex=0;
    long maxdownindex=0;
    long maxdown=0;

    for(i=0;i<n;i++)
    {
        upi=countup[i];
        downi=countdown[i];
        if(upi>maxup)
        {
            maxup=upi;
            maxupindex=i;
        }
        if(downi>maxdown)
        {
            maxdown=downi;
            maxdownindex=i;
        }

    }
    long index;
    if(maxdown>maxup)
    {index=maxdownindex;flag=DOWN;
    }

    else
    {index=maxupindex; flag=UP;}
    long indexup=index+h-1;
    long indexdown=index-h+1;

        for(i=0;i<n;i++)
{       
        upi=o[i].up;
        downi=o[i].down;
        if(flag==DOWN)
    {

            if(upi<indexup)
            {
            count=count+indexup-downi;
            }
            if(downi>index)
            {
            count=count+downi-index;
            }

    }
    if(flag==UP)
    {


            if(upi<index)
            {
            count=count+index-upi;
            }
            if(downi>indexdown)
            {
            count=count+downi-indexdown;
            }

        }
    }
    printf("%ld\n",count);  





}
}

【问题讨论】:

  • 您的假设看起来还不够远。第一个scanf("%d",&amp;time); 其中int time; 是正确的。因此,当您省略整个 while 循环时,问题就在其中。
  • 格式化代码时:1) 总是在每个左大括号 '{' 之后缩进,并且在每个右大括号 '}' 之前不缩进 2) 永远不要使用制表符进行缩进,因为每个字处理器/编辑器都有制表位/tap 宽度设置不同。 3) 建议使用 4 个空格进行缩进,因为它的宽度足以清晰可见,即使是可变宽度字体,也不至于太宽以至于仅使用少量缩进级别就会占用编辑器/可打印页面的宽度。跨度>
  • 当#define'ing 数值时,总是用括号包裹数值以避免“文本替换”错误
  • 1) 请为变量使用有意义的名称。 2) 'time' 是一个众所周知的函数,对于变量名使用众所周知的函数名称是个坏主意 3) 当请求用户输入时,总是提示用户他们要输入什么。否则,用户正在看着一个闪烁的光标,不知道下一步该做什么。 4) 当代码块(If、while、else 等)前后都被空行包围时,代码的可读性/可理解性要高得多。
  • 在栈上声明了 'struct cave' 和 'long',长度为 100 万。这是超出可用堆栈空间的“好”方法。建议 1) malloc 这些数组,只在堆栈上留下一个指针或 2) 将它们移动到文件全局空间。

标签: c segmentation-fault structure


【解决方案1】:

我怀疑问题在于 scanf 格式字符串“%ld”试图写入 64 位值。但是“long”类型只能保证至少为 32 位(是的,实际上与 int 的大小相同)。尝试将参数声明为 long long 类型——它们必须是 64 位长。

【讨论】:

  • scanf %ld 获取指向 long int 的指针。将long long int * 传递给它是错误的。 (不,long long 不需要是 64 位宽。)
  • 是的。根据 c99 标准,它只能保证 至少 64 位宽。 open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf(见第 22 页)。至于 %ld --> 64 位,你也在那里,我开枪了。 %lf 是一个 64 位双精度数,但 %ld 只是一个长整数(在大多数实现中也就是 32 位。)
猜你喜欢
  • 2013-03-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多