Chinaunix首页 | 论坛 | 博客
  • 博客访问: 699753
  • 博文数量: 94
  • 博客积分: 2812
  • 博客等级: 少校
  • 技术积分: 1555
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-08 21:28
文章分类

全部博文(94)

文章存档

2012年(23)

2011年(39)

2010年(14)

2009年(18)

分类: C/C++

2009-11-11 00:04:57

段错误个人理解就是访问了不可访问的内存!要么这个内存去不存在,要么就是受操作系统保护!
个人遇到段错误的几次都是由于指针的使用,没有考虑周全。。。比如访问了一个根本不存在的区域,比如:
#include
#include
int main(int argc,char *argv[])
{
    DIR  *dp;
    struct dirent *dirp;
    if(argc!=2) //只列出了命令时,提示输入文件夹名称
    {    printf("请输入想要列出的文件夹名称!\n");
        //exit(1);//此处不退出则结果包含段错误!!-------->KEY
    }
    if((dp=opendir(argv[1]))==NULL)//如果此处不存在argv[1],则显示“段错误”
        printf("不能打开该目录!");
    while((dirp=readdir(dp))!=NULL)
        printf("%s\n",dirp->d_name);
    closedir(dp);
    exit(0);
}
这段程序功能是模拟ls命令,显示文件夹下面的文件名,
gcc -o myls myls.c
**********
./myls  /media/yule
.....   //显示娱乐盘符下的内容
************
./myls 回车
请输入想要列出的文件夹名称!
段错误
分析下:此处的命令行参数个数为1,argv[1]根本没有被赋值,所以结果可想而知,就是指针使用上的常见错误!
至于受操作系统保护一说,我想到了一个简短的代码:
#include
int main()
{       
    int i = 0;     
    scanf ("%d", i); /* should have used &i */       
    printf ("%d\n", i);      
    return 0;
}
$:gcc -o test test.c
$:./test
10
段错误
通过gdb调试我发现,问题所在就是,i被初始化为0,而scanf一句此时功能是想地址为i的内存输入一个值,也就是说我们正在尝试想地址为0 的区域输入一个值!
其实第一个也可以说成数组越界,都会产生段错误,我都遇到过!
以上是我的一点点体会理解,不知道说的有没有什么不妥的,第一次发技术帖(自认为)希望借此抛砖引玉阿
阅读(1669) | 评论(0) | 转发(0) |
0

上一篇:fread

下一篇:文件操作篇

给主人留下些什么吧!~~