今天我在Linux(Ubuntu )虚拟机下用c/c++编写程序实现拷贝一个文件的程序,结果在运行的时候,提示如下错误:
段错误 (核心已转储)
ubuntu@ubuntu-VirtualBox:/home$ sudo ./copy hello.c hello2.c
原因:
查了一下资料,加上自己的实践,有以下几个主要的原因:
1、内存访问出错
这类问题的典型代表就是数组越界。
2、非法内存访问
出现这类问题主要是程序试图访问内核段内存而产生的错误。
3、栈溢出
Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。 因此如果你数组开的过大变会出现这种问题。
解决方法:
前两种问题的原因解决方法我就不多说了。我主要简单说下第3种“栈溢出”的解决方法,如下:
1、 首先,我们先看一下系统默认分配的资源:
ubuntu@ubuntu-VirtualBox:/home$ ulimit -a
可以看到默认分配的栈大小为8M。
2、如果真的需要更大的栈空间,可以用指令“ulimit -s XXXX”来申请更大的栈空间。
现在再来谈一谈我是如何解决 “段错误 (核心已转储)”这个问题的?
其实解决问题很简单,由于我用的是普通用户,并没有用root用户,估计是权限的问题,不让我访问内存什么的。我只需要加上 sudo 再来执行就可以正常了,如下:
ubuntu@ubuntu-VirtualBox:/home$ sudo ./copy hello.c hello2.c