365bet游戏开户-约彩365官旧版本网客户端下载-365双试投注

Est. 1980 · 每日复古新闻

为什么RE?

为什么RE?

为什么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了。所以下次自己调调看吧,不要去麻烦那些大佬了,因为大佬不一定有时间看你的代码啊。

相关文章