原创
关于“段错误”个人小结
2010-7-29 09:33
2031
5
5
分类:
工程师职场
段错误个人理解就是访问了不可访问的内存!要么这个内存去不存在,要么就是受操作系统保护! 个人遇到段错误的几次都是由于指针的使用,没有考虑周全。。。比如访问了一个根本不存在的区域,比如: #include<stdio.h> #include<dirent.h> 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 <stdio.h> 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 的区域输入一个值! 其实第一个也可以说成数组越界,都会产生段错误,我都遇到过!
文章评论(0条评论)
登录后参与讨论