为什么RE?
encore
·
2018-11-01 22:37:19
·
个人记录
“新人求教,XXX那题,本机AC,XXOJ RE”
“process exited with return value 3221225725”
RE这种东西一般都是很容易查的,在这里给出常见RE提示:
EACCES:访问出错
EAGAIN:文件已被锁定,或者太多的内存已被锁定
EBADF:fd不是有效的文件描述词
EINVAL:一个或者多个参数无效
ENFILE:已达到系统对打开文件的限制
ENODEV:指定文件所在的文件系统不支持内存映射
ENOMEM:内存不足,或者进程已超出最大内存映射数量
EPERM:权能不足,操作不允许
ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
SIGSEGV:试着向只读区写入
SIGBUS:试着访问不属于进程的内存区
···以及常见RE原因
数组越界
基本上是数组开太小。。。
尤其是图论题。比如手写循环队列要2*n,无向图边数要乘2。。。别的题也有,比如线段树开4*n什么的。。。
然而你开到2n,能访问的只能到2n-1,所以一般是2n+1一类。
也有可能在循环中出现负下标。
除以0
经常在循环中出现,或者没加特判。有些OJ上会显示“浮点错误”。
局部变量没有初始化
然后用来当数组下标。。。
类型错误
比如:
long long a;
scanf("%d",&a);
www (不要告诉我你没看出来
这个有时候是RE,有时候是WA,也有可能会是CE。。。
爆int,long long
有些时候也会CE、死循环。常在运算过程或类型转换时出现。。。注意C++默认类型是int。举个例子:long long a = 1000000000000000ll,注意ll。
递归爆栈
往往是递归写偏了。。。不然会显示TLE。
这里说明一下,有时候会出现本机RE,OJ AC的情况,是因为操作系统分配栈空间大小不同的原因。
具体来说,在OJ上栈空间大小限制属于“内存限制”,而本机上栈空间会受到系统限制。这可能会给本机调试带来一定的麻烦,所以解决方法是:在编译时加入-Wl,--stack=104857600命令(不一定要104857600,开大一点就行,但不要太大)。
如果你使用Dev-C++,只需要把工具->编译选项->在编译时加入以下命令 勾选,并在下方的框内加入上文所说的命令即可。
建议能常规DP不要记忆化搜索(虽然记忆化搜索更好写),他很占内存的,容易MLE。
指针问题
scanf没有取址(加&)啊,访问了不该访问的地址啊,没有判断出来的空指针什么都有可能导致RE。重载函数出现的RE高概率是这种(比如 this 的问题)。
如果你在玩珂朵莉树等一些要用到STL容器的东西时RE,一般也是迭代器和指针的问题。
类型问题
举个例子,比如下面这个程序
#include
using namespace std;
int main()
{
char *st = "hello world";
char ch=getchar();
st[0] = ch;
return 0;
}
就会RE。因为st所指的内存区域是const(只读)(.rodata)类型。正确代码如下:
#include
#define maxn 101
using namespace std;
int main()
{
char st[maxn] = "hello world";
char ch=getchar();
st[0] = ch;
return 0;
}
其表面原因在于指针。更复杂的原因涉及到内存分配规则,我也不太清楚 觉得只要了解一下就好了。
还有,重载<时,要在花括号前面加一个const,并最好把函数写在结构体里面,否则有时候会出错。
return了奇怪的东西
无聊的话return 1,不小心(JC)的话return o啊什么的。。。return printf("%lld",ans)这种东西放在main函数里就很危险了。
看上去很少,但是足以解决绝大部分RE了。所以下次自己调调看吧,不要去麻烦那些大佬了,因为大佬不一定有时间看你的代码啊。