免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6476 | 回复: 20
打印 上一主题 下一主题

[C] linux下一段程序出现segment default 求解【已解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-17 19:50 |只看该作者 |倒序浏览
本帖最后由 espace_2009 于 2014-03-18 14:44 编辑
  1. #include<unistd.h>
  2. #include<sys/stat.h>
  3. #include<fcntl.h>
  4. #include<dirent.h>
  5. #include<string.h>
  6. #include<stdio.h>
  7. #include<stdlib.h>

  8. typedef struct filelist{
  9.     char *name;
  10.     long int lenth;
  11. }file_list;

  12. file_list* scanfile(char *dirname){
  13.     struct dirent **namelist;
  14.     struct stat buf;
  15.     const char *err_string;
  16.     int n;
  17.     n= scandir(dirname,&namelist,0,alphasort);    //扫描目录下的文件
  18.     if(n<0)
  19.         perror("error occurred!");
  20.     file_list *flist;
  21.     if(NULL==(flist = (file_list *)malloc(n*sizeof(file_list))))
  22.           perror("malloc failure");
  23.     int filecount = 0;
  24.     int i;
  25.     for(i=0; i < n; i++){
  26.        if(strcmp(namelist[i]->d_name,".") != 0&&strcmp(namelist[i]->d_name,"..") != 0){
  27.            flist[filecount].name = (char *)malloc(128);
  28.            //flist[filecount].name= strdup(dirname);
  29.            strcpy(flist[filecount].name, dirname);
  30.            strcat(flist[filecount].name,namelist[i]->d_name);
  31.            printf("file name: %s \n",flist[filecount].name);
  32.            int fildes ;
  33.           if(-1==(fildes = open(flist[filecount].name,O_RDONLY)))  //打开文件
  34.           {        perror(err_string);
  35.                     exit(-1);
  36.           }  
  37.           // stat(flist[filecount].name,&buf);

  38.            flist[filecount].lenth = (int)lseek(fildes,0,SEEK_END);  //获取文件长度
  39.            //flist[filecount].lenth=buf.st_size;
  40.            printf("file lenth : %s \n",flist[filecount].lenth);
  41.            close(fildes);
  42.            filecount++;   //文件计数+1
  43.        }
  44.       // printf("file count: %d \n",filecount);
  45.     }
  46.     return flist;
  47. }


  48. int main(int argc, char **argv){
  49.    file_list *flst;
  50. //    if( argc != 2 ){
  51. //        printf("usage : %s dirname \n", argv[0]);
  52. //        exit(-1);
  53. //    }
  54. //    else
  55.         flst=scanfile("/home/test");

  56.     return 0;
  57. }
复制代码
上面这段代码视为了扫描一个目录下所有文件,并把文件指针和大小存储到自定义的结构filelist中。调试通过,运行出现段错误  
gdb调试错误是
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a5ef90 in _IO_vfprintf_internal (s=<optimized out>,
format=<optimized out>, ap=ap@entry=0x7fffffffda1 at vfprintf.c:1655
1655 vfprintf.c: 没有那个文件或目录.
似乎是open打开文件处出现问题了,但又无法确定 求解到底是哪个位置出问题了


添加两个头文件后段错误已经排除 现在只是open函数打开文件,返回值-1  得到的似乎不是正确的文件路径

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2014-03-17 21:55 |只看该作者
回复 1# espace_2009


    printf("file lenth : %s \n",flist[filecount].lenth);

length 是个 int,你干嘛要用 %s 打印?编译器的警告没开么?

论坛徽章:
0
3 [报告]
发表于 2014-03-18 08:38 |只看该作者
回复 2# MMMIX


这个是我看到了,是写错了 和这一句没多大关系 只是有警告

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2014-03-18 08:41 |只看该作者
没有return的函数。编译器通过了吗?没有警告吗?

论坛徽章:
0
5 [报告]
发表于 2014-03-18 08:41 |只看该作者
回复 2# MMMIX


   调试的时候,open打开文件那个位置返回的是-1 ,不知道是怎么回事

论坛徽章:
0
6 [报告]
发表于 2014-03-18 08:46 |只看该作者
回复 4# cobras


    编译可以通过只是有警告而已  

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2014-03-18 09:35 |只看该作者
回复 5# espace_2009


    你把你构造出来的 path 打印出来看看就知道怎么回事了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2014-03-18 09:37 |只看该作者
回复 3# espace_2009


    你这个 printf 是没有执行到,执行到的时候估计又是一个 segmentation fault.

论坛徽章:
0
9 [报告]
发表于 2014-03-18 10:01 |只看该作者
回复 7# MMMIX


    路径打印出来是正常的  得到文件长度不正确 open 那一处返回了-1
   
  

论坛徽章:
0
10 [报告]
发表于 2014-03-18 10:45 |只看该作者
会不会是文件open没成功但你却进行close操作导致的段错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP