linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是啥问题

作者&投稿:丛包 (若有异议请与网页底部的电邮联系)
linux下gcc 编程 段错误(核心已转储) 大神救我,折磨我一天了...~

在的所在.c文件的目录中
在终端里面敲
1. ulimit -c unlimited
2. 在用gcc编译时,在最后加上-g
3. 运行一次错误代码,出现段错误后, 目录中有一个core文件
4. 运行:gdb ./a.out core
会自动帮你找出可能出错的代码,出现段错误一般都是越界了

#include"stdio.h"#include"stdlib.h"#define NMEMB 50#define SIZE 10#include int compar (const void *a,const void *b){return (strcmp((char *) a, (char *) b));}int main(){ char data[NMEMB][SIZE]={"Linux","freebsd","solzris","sunos","windows"}; char key[80],*base,*offset; int nmemb= 5,size=SIZE; fgets(key,sizeof(key)/sizeof(key[0]),stdin); key[strlen(key)-1]='\0'; base = data[0]; offset = (char *)bsearch(key,base,nmemb,size,compar); if(offset ==NULL) { printf("%s not found!
",key); } else { printf("found : %s
",offset); }}

主要有以下几个方面的原因:

一、内存访问出错

这类问题的典型代表就是数组越界。

二、非法内存访问

出现这类问题主要是程序试图访问内核段内存而产生的错误。

三、栈溢出

Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。

因此如果数组开的过大变会出现这种问题。

扩展资料:

注意事项

段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。

一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。在编程中基本是是错误地使用指针引起的。



出现此问题的原因如下:

1、内存访问错误

这种问题的典型代表是数组越界。

2、非法内存访问

这种问题主要是由程序尝试访问内核段内存的错误引起的。

3、堆栈溢出

默认情况下,Linux为进程分配8M的堆栈空间。 当C ++申请变量时,新申请的变量在堆中,而其他变量通常存储在堆栈中。

因此,如果数组太大,则会出现此问题。

扩展资料:

段故障通常意味着访问的内存超出了系统为程序分配的内存空间。 通常,此值由gdtr存储,是一个48位寄存器,其轨道中的32位由其存储。 

gdt表,后13位保存与gdt对应的下标,后3位包括程序是否在内存中以及cpu中程序的运行级别,gdt指向的表是一个以64位为单位的表。在此表中,代码段的信息和数据段的起始地址,相应的段限制和页交换,程序运行级别和内存粒度存储在该表中。

一旦对程序进行越界访问,CPU将生成相应的异构保护,并且将出现分段错误。 基本上,这是由于编程中不正确使用指针引起的。



linux系统为一个进程的分配的堆栈空间只有8k左右,你定义了一个300万的整形数组,需要占用3000000*4=1200万k大小的堆栈空间,肯定会把堆栈撑爆的,故会出现核心已转储的错误提示。

为了提高程序的健壮性,防止堆栈越界的情况发生,一般局部变量分配的空间不要超过1024字节大小,就是一个255的整形数组。如果你想要用超过1024字节以上的空间,就调用malloc在堆中分配你想要的空间。

大概是堆栈溢出,3百万个指针的数组太大了,占地12M(32位机器),24M(64bit)。
想确认请在终端输入 ulimit -s,查看堆栈限制。
想无视堆栈限制,请尝试ulimit -s unlimited

segmentation fault(core dump)
你写的代码有严重bug,导致程序崩溃


如何安装arm-linux-gcc
对于学嵌入式linux的来说,拿到板子后,建立开发环境是开发的第一步,arm-linux-gcc是基于arm架构的linux平台交叉编译工具。下面是按转步骤。版本arm-linux-gcc-4.4.3 下载arm-linux-gcc-4.4.3.tar.gz安装包。打开终端,输入 sudo tar xvzf arm-linux-gcc-4.4.3.tar.gz -C \/ 安装arm-linux...

请问linux下cc和gcc是同一个东西吗?
有一些在UNIX中写好的程序要放在linux中要指定命令CC编译器,所以将CC指定为GCC。其实就是一个东西。一般的CC它就是一个软件链接,你可以使用命令:whereis cc来查看一下它在什么路径,然后你再使用ls -l命令查看一下它的详细信息,是不是在它的后面有一个箭头(-->)指向一个可执行文件。

怎样在Linux下编程?需要什么技术?
在Linux下,C语言的编辑器为vim。但是想要在vim上编写代码,就需要了解vim基本命令的使用,因为vim的使用使用vim命令来进行交互的。当我们熟悉了vim命令的使用后,我们就可以自由自在地在Linux下编写我们的C语言代码啦,然后用gcc编译器编译我们写好C语言代码的文件,就可以得到可执行程序,运行可执行程序,就可以看到输出...

在Linux环境下如何安装GCC编译器
1、在Linux环境下只要能链接Internet就可以通过本地的yum源来安装,在终端下输入yum install gcc就可以 2、linux内核自带了这些硬件的驱动,无须下载安装的 3、你用的是虚拟机,只要在安装linux的时候设定好以桥连的方式共享Internet就可以上网的 4、这个还没试过。你可以搜索一下虚拟机与本地文件共享...

如何安装arm-linux-gcc
最常见的首先要下载arm-linux-gcc安装包,或者也可以从网上下载arm-linux-gcc的源码。进入Linux,将当前目录设为arm-linux-gcc的下载目录,并且输入tar -xzf arm-linux-gcc-4.4.3.tar.gz,同时将文件解压,解压后会有一个opt的文件夹。如下图所示:在\/usr\/local\/中建立一个名为arm的文件夹,同时...

为什么在linux下直接运行安装gcc的rpm包是有如下错误啊
缺少依赖的包,Linux下的软件有一些是需要先安装其它包才能安装使用的,它们之间这种联系成为依赖关系。如果可以联网的话,建议你使用yum安装,以root身份执行yum install gcc即可,yum会帮你安装其它依赖包的了。

请问linux下,gcc编译程序的过程(从读取源文件到制作可执行程序中间所有...
请问linux下,gcc编译程序的过程(从读取源文件到制作可执行程序中间所有过程,越详细越好) 所有资料均可:链接(次之)、复制+粘贴(最次之)、手打(最好)但只要中文,若通过我的提问,分数必给关于查文档我也知道,但是最好能有一些个人的理解... 所有资料均可:链接(次之)、复制+粘贴(最次之)、手打(最好)但只要...

Linux下做C语言开发,有哪些好用的工具,召唤最佳答案
Linux下的主要的C语言编译器 1. GCC 大名鼎鼎的GNU的C\/C++\/Obj-C编译器, 当前版本是2.8.1, 但据说与2.7.*有兼容性 问题. 而使用较广的是gcc 2.7.2系列, 如RedHat5中带的就是gcc 2.7.2.3 有时候在Cyrix上用gcc会有些问题, 因此有一套针对Cyrix特点的gcc 2.7.2.3 我这里有RedHat...

linux安装gcc编译器 进入到gcc-4.4.7目录中,执行.\/contrib\/download_pr...
不会编译安装了,直接搭yum or network yum install gcc...

linux下安装了6.1.0版本的gcc,但cmake时用的还是旧版的gcc
root@ops-test01 gcc-6.1.0]# find \/ -name libstdc++.so.6 \/usr\/lib64\/libstdc++.so.6 \/usr\/local\/lib64\/libstdc++.so.6 \/usr\/local\/src\/gcc-6.1.0\/build\/stage1-x86_64-pc-linux-gnu\/libstdc++-v3\/src\/.libs\/libstdc++.so.6 \/usr\/local\/src\/gcc-6.1.0\/build\/prev-x86_64...

颍东区13756279053: 在linux虚拟机编写C程序,用gcc编译时为什么提示“段错误”? -
惠茜和肝: 提示段错误 一般都是数据溢出了 非法访问~~ 比如你的数组int a[2] 如果你访问了 int b = a[3] 这时就会出现段错误

颍东区13756279053: linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是啥问题 -
惠茜和肝: 出现此问题的原因如下: 1、内存访问错误这种问题的典型代表是数组越界.2、非法内存访问这种问题主要是由程序尝试访问内核段内存的错误引起的.3、堆栈溢出默认情况下,Linux为进程分配8M的堆栈空间. 当C ++申请变量时,新...

颍东区13756279053: kali linux的gcc编译完的C语言小程序,为什么执行后显示段错误?求各位大神的说明或解决方法. -
惠茜和肝: scanf里边不能含有除格式之外的东西,像你这里有The th level.是不行的.把scanf这一句改为 scanf("%d",&n); 如果要显示输入的n的多少,就再加一句 printf("The %dth level.\n",n);

颍东区13756279053: Linux中对GCC源文件进行配置时,出现如下错误:no acceptable cc found in $PATH,该如何是好? -
惠茜和肝: 你是什么系统 如果百是redhat或是fedora的话,直度接yum install gcc 如果是debian ubuntu mint的话,直接apt-get install gcc yum的源也需要版配置一下,可以上网搜一下就权行.

颍东区13756279053: C语言 char型数组,linux下GCC编译后出现段错误. -
惠茜和肝: printf("%c\n",k[0]);

颍东区13756279053: C语言在linux下编译通过,一运行就段错误 -
惠茜和肝: linux里面段错误就是内存访问的错误了,应该是你代码里的内存分配有问题,因为没看到你这里的struct studen的具体定义,只能让你注意看下studen的name这个字符串的定义,txt文件里的name字段有没有超出这个name的定义长度,如果超出了,fscanf就会报内存错误了

颍东区13756279053: linux运行程序段错误··要怎么解决·· -
惠茜和肝: 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往 系统保护的内存地址写数据 最常见就是给一个指针以0地址, unsigned char *ptr = 0x00;2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域 我以前也遇到过这个问题后来就是参考这个帖子找到问题的,希望可以帮助到你 http://blog.csdn.net/yeyuangen/article/details/6822004

颍东区13756279053: 求教:gcc编译完的程序,运行时候提示段错误,下面有问题补充. -
惠茜和肝: 段错误,肯定是非法使用指针.检查你的指针是不是越界了吧.程序很乱,刚看清楚,b指针指向的字符串是const类型,是不能被修改的,所以你的copy函数是错误的!

颍东区13756279053: LINUX下C出现段错误如何有GDB调试? -
惠茜和肝: 问出这种问题的人还是建议你不要直接用gdb了 可以考虑使用eclipse+cdt或者其他的ide segment fault的话通常是内存问题,比如指针 数组越界或者stack溢出.先检查一下相关代码

颍东区13756279053: 为什么这个程序经gcc编译器编译后,会报告段错误? -
惠茜和肝: char* cp1,* cp2;cp1 = "12345";cp2 = "abcdefghij";此时编译器会在常量区分配2个字符串,分别是12345,abcdefghij,然后把cp1和cp2指向这里因此cp1和cp2是不可修改的,strcpy执行当然会报错

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网