黑马程序员技术交流社区

标题: C 语言 段错误 (核心已转储)(Ubuntu) [打印本页]

作者: darewolf    时间: 2015-3-19 22:44
标题: C 语言 段错误 (核心已转储)(Ubuntu)
一 般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指 向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了.  在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的
  1)访问系统数据区,尤其是往 系统保护的内存地址写数据    最常见就是给一个指针以0地址
   2)内存越界(数组越界,变量类型不一致等
   3) 访问到不属于你的内存区域  
这是我程序
cpp] view plaincopyprint?
#include <stdio.h>  
#include <string.h>  
  
int main()  
{  
    char s1[100]={0};  
    char s2[20];  
    char *p=NULL,cl;//如果此处*p为空,就会引起断错误  
    int i=0;  
    int a=0,b=0,len=0,k;  
    printf("input the string NO\n");  
    scanf("%i",&i);  
    printf("the NO is %d\n",i );  
    k=i;  
    for(;i>0;i--)  
    {  
        scanf("%s",s2);  
        cl = getchar();  
        len = strlen(s1);  
        printf("%d\n",len );  
        if(len!=0)  
        {  
            s1[len]=cl;  
            s1[len+1]='\0';  
        }  
        strcat(s1,s2);  
    }  
  
    printf("string input over\n" );  
    printf("%s\n",s1);  
      
    for (;k>0;k--)  
    {  
        p=strchr(s1,cl);  
        len=p-s1;  
        s1[len] = ' ' ;//此处 为空格   
        printf("%d\n",len);  
        printf("the string is %s\n",s1 );  
         
    }  
}  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2