Skip to content

Linux(Ubuntu)环境下编译c/c++问题小记(段错误)

由于在linux下,对各种报错信息不熟悉,所以很多错误我都要调很久才能弄好。当然,首先我自己程序写出这么多错误就是我自己的问题。下面我就把我昨天遇到的几个问题及解决方案记录下,供大家参考。

1.warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
我在编译后,一下子跳出了这个讯息,自己检查了程序半天都没有发现什么明显错误,于是去百度了一发。
百度上主要给的解释是因为用scanf读取输入的时候 scanf(“%d”,&a),&的符号没有加,没有传入地址,所以造成错误。还有一种可能是传入指针名的时候,并不用加&,结果多加了&,比如果说 scanf(“%s”,a)。这样改一般就能解决。

可是我自己看了我写的,并不存在这个问题,这时候我就感觉到很困惑,卧槽,这尼玛什么鬼?看了好多条都说是这个原因,没办法了,我只能自己继续想。
后来乱改,可能主函数变量名和我调用其它函数的形参和实参相同造成的问题,其实逻辑上讲这根本不会是问题,不过编程总会有玄学发生,我改了以后确实解决了。也许遇上同样warning的你也可以试试,说不定就解决了。

2.
/bin/bash: 行 1: 6019 段错误 (核心已转储)
core dumped
/bin/bash: 行 1: 5753 段错误
segment fault
上面这几个关键词都有跳出来过,我也不知道哪个前后了。如果你遇到上述几个报错,那么问题很有可能就是stack overflow或者内存越界(数组越界,变量类型不一致)。
在linux的shell里输入

ulimit -a

可以查看讯息,看下你的stack size,我的是在8000出点头。系统栈空间8M,然而算算我开的数组,实际上已经超过了stack的边界。

解决方法有三个,一个是把数组开到全局,这个绝大多数就能开的下。

第二种就是使用vector容器来替代数组。

第三种就是自己扩栈。如果你只是想满足本地环境的话,使用指令

ulimit -s 102400

这样就把栈大小改到100M,一般够用。

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*