【发布时间】: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",&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