当前位置:  技术问答>linux和unix

运行提示:“断错误”,请高手帮我看看,解决问题者100分重谢!

    来源: 互联网  发布时间:2016-08-25

    本文导语:  我写了这样一个函数:  *fuction        get the item value from filepath and store it in the struct  get_value  *return value   sucess:0 fail:1 */ int get_file_item (char *filepath, struct get_value  *value) {        FILE *file_stream...

我写了这样一个函数:

 
*fuction        get the item value from filepath and store it in the struct  get_value
 *return value   sucess:0 fail:1
*/
int get_file_item (char *filepath, struct get_value  *value)
{
       FILE *file_stream;
char file_line[255];
char *head_ptr_name = NULL;
char *head_ptr_exec = NULL;
char *head_ptr_type = NULL;
char *cursor_ptr = NULL;
int  item_value_len;
value=(struct  get_value *)malloc(sizeof(struct  get_value));
value->name=(char*)malloc(100);
       value->type=(char*)malloc(100);
value->exec=(char*)malloc(100);
filepath=(char*)malloc(200);
file_stream = fopen(filepath,"r");
if ( file_stream == NULL)
{
     printf("unable to open the file %s!",filepath);
     return 1;
}
while (fgets(file_line,255,file_stream)!=NULL)
{
     head_ptr_name=strstr(file_line,"Name=");
     head_ptr_exec=strstr(file_line,"Exec=");
     head_ptr_type=strstr(file_line,"Type=");
     if ((head_ptr_name == NULL) && (head_ptr_exec == NULL) && (head_ptr_type==NULL)) 
  continue;
     else if (head_ptr_name != NULL)
         {
cursor_ptr=head_ptr_name;
cursor_ptr+=strlen("Name=");
while (*cursor_ptr == ' ')  /*skip the blank space*/
{
                        cursor_ptr++;
}
item_value_len=strlen(cursor_ptr);
strncpy(value->name,cursor_ptr,item_value_len);
 }
     else if (head_ptr_exec != NULL)
                 {
cursor_ptr=head_ptr_exec;
                     cursor_ptr+=strlen("Exec=");
                     while(*cursor_ptr == ' ')
                      {
    cursor_ptr++;
}
                     item_value_len=strlen(cursor_ptr);
                     strncpy(value->exec,cursor_ptr,item_value_len);

                 }
     else if (head_ptr_type != NULL)
                 {
 cursor_ptr=head_ptr_type;
                      cursor_ptr+=strlen("Type=");
                      while(*cursor_ptr == ' ')
                         {
     cursor_ptr++;
 }
                      item_value_len=strlen(cursor_ptr);
                      strncpy(value->type,cursor_ptr,item_value_len);

                  }

}
return 0;

}
/*
 *fuction        get the file counts include the directory from the path
 *return value   sucess:the file counts  fail:-1
*/
int get_file_counts(char *path)
{
int file_count;
       file_count=scandir(path,&namelist,0,alphasort);
if (file_count > 0)
   return file_count;
else
   return -1;
}
struct get_value结构体的定义如下:
/*store the tempory value*/
struct get_value
{
char *name;
char *type;
char *exec;
};
我在主函数中是这样调用它的
int main()
{
    ........
     struct get_value *value;
    value=(struct get_value * )malloc(sizeof(struct get_value));
     .........
      get_file_item(file, value);
    ......
}


运行时总是提示:段错误! 真实烦死人了,哪位朋友可以帮我看看上面的问题出在哪? 谢谢了

|
strstr和strlen函数可以会导致溢出,因为file_line没有初始化且最后一个也不一定是

|
你确认文件能打开吗?在我看来,文件打不开才正常
    filepath=(char*)malloc(200);
    file_stream = fopen(filepath,"r");


好吧,假设文件正常打开了,再看看读文件的代码:
fgets(file_line,255,file_stream)

file_line长度为255,所以此处传递给fgets的大小应该是254(因为要留一个字节存储'')
如果当读到超过254个字符的行,此处会发生溢出,根据不同的平台和编译器,
指针file_stream或head_ptr_name有可能被破坏
估计你被意外修改的指针是file_stream,在下一次读文件时,就会发生段错误。

|
filepath=(char*)malloc(200);
    file_stream = fopen(filepath,"r");
======================
上面这两句话大错特错了!,你怎么能分配空间后就开始fopen呢,你要知道filepath此时里面的内容可都是谁也不知道的东西哦!

请问你调用函数的实参是否有文件路径?

如果有的话,那你在调用函数中就不要把它抹掉~!

如果没有的话,那你就应该在打开之前给他文件路径!

|
在term下输入ulimit -c unlimited
运行你的程序
会看到core.xxxx的文件
然后gdb ./程序名 ./core.xxxx
接着输入where就可以看到是什么地方死掉了

|
字符串是段错误的高发地,用gdb调试下很容易解决

|
段错误多半由数组越界产生的

好像是这个问题

strncpy(value->name,cursor_ptr,item_value_len);
strncpy(value->exec,cursor_ptr,item_value_len);
strncpy(value->type,cursor_ptr,item_value_len);



char * strncpy(char *dest, char *src, size_t n);

如果src的长度大于n,则不会向dest中复制空字符串,在下面使用它时就会出错。

    
 
 

您可能感兴趣的文章:

  • windows下cmd命令提示符下让程序后台运行命令
  • 高手指教:SCO UNIX突然提示没有用户license是什么原因?然后系统运行提示network is down,如何解决?
  • RH9下装了wine-2005011,运行qq提示说有问题。大虾帮忙看看。
  • 求救,程序运行时出现"闹钟"提示错误!!!!
  • linux 安装 oracle 运行./runinstall 提示没有这个文件
  • 在IE下执行servlet时为什么有些servlet可以正常运行,有些却提示下载文件?
  • 在LINUX下安装TOMCAT后,root运行提示权限不够。
  • 我在linux系统下安装subversion时,运行svnadmin create命令时出现这个错误提示:
  • Resin运行,出现如下提示,是否表示Resin已经运行正常了
  • applet在sun工作站的Netscape中运行的提示,请问各位大虾如何应对?
  • 装有DB2的SCO UNIX系统运行中,出现警告提示...请问此警告是什么意思,如何解决?
  • red hat 运行 mysql5.1 出现奇怪提示
  • x86的solaris10下运行程序提示“无效的自变量”
  • 运行时的出错提示!
  • 运行sbin/lilo时为什么提示柱面大于1024
  • g++编译联接都通过,运行却提示"段错误",怎么回事?
  • kao,用root 登录竟然运行useradd 竟然提示说没有这个命令
  • 安装jbuilder6后,运行时提示'Unknown license file format', WHY?
  • 在windows xp中安装了cygwin,但运行的时候提示cygintl-8.dll找不到
  • 板子上运行某个程序提示找不到libpthread.so.0
  • 为什么运行BIND的named,会出现这个提示?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Unmounting initrd failed 错误表示什么错误?可能是由什么引起的?系统原来一直运行正常,突然发现系统登陆错误,重启提示以上错误。
  • gnu c++如何得到对于编译错误和运行错误的帮助?
  • jsp有没有检查语法错误的东西,难道只能在改完了在服务器上运行然后才能找到错误吗?
  • 我用javac编译HelloWorldapp.java无错误,但运行时出现该错误:Exception in thread "main" java.lang.NoClassDefFoundError: helloworldapp
  • aix 编译正确后运行异常错误
  • 运行JAVA命令错误
  • 请教:system("C:\python2.4\python.exe C:\aa.py");该语句有何错误?为什么运行界面一闪就消失了并且没有运行完,请给出正确语句!
  • 错误22022 SQLServerAgent当前未运行的解决方法
  • 新手提问,应用程序运行:Permission denied错误
  • 运行sipp 出现 Unable to bind main socket 错误
  • 急,磁盘错误,程序运行很慢!
  • 我使Jsequence遇到如下错误(我不熟悉JAR,可能是运行JAR的错误),麻烦各位看一下,在线等,(帮我搞定的另外送100分)
  • 运行helloworld时出现错误,怎么回事?
  • 无法从 int? 转换为 int 运行时出现错误
  • 求救!weblogic6.0后台运行正确,前台页面跳转或调用其他页面时出“页面无法显示错误”
  • linux新编译运行错误
  • 运行automake时的错误
  • 运行时报这种错误!
  • 运行<<UNIX网络编程卷一>>中程序的错误?
  • java程序运行错误
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • 在docker容器中运行hello world!
  • 如何运行外部命令后不等外部命令运行结束直接运行下一条命令
  • 通过docker ps命令检查运行中的docker镜像
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 通过docker run命令运行新的docker镜像
  • 用Jbuilder3 遇到问题不能运行把可疑代码注掉后可以运行但是重新使用可疑代码时又可以运行了多次重复都是如此
  • 安装运行微软win7/Windows7系统要求及官方下载地址
  • “模块”在内核中运行与作为单独进程运行在机制上有什么区别与联系?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3