当前位置: 技术问答>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没有初始化且最后一个也不一定是
|
你确认文件能打开吗?在我看来,文件打不开才正常
好吧,假设文件正常打开了,再看看读文件的代码:
file_line长度为255,所以此处传递给fgets的大小应该是254(因为要留一个字节存储'')
如果当读到超过254个字符的行,此处会发生溢出,根据不同的平台和编译器,
指针file_stream或head_ptr_name有可能被破坏
估计你被意外修改的指针是file_stream,在下一次读文件时,就会发生段错误。
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此时里面的内容可都是谁也不知道的东西哦!
请问你调用函数的实参是否有文件路径?
如果有的话,那你在调用函数中就不要把它抹掉~!
如果没有的话,那你就应该在打开之前给他文件路径!
file_stream = fopen(filepath,"r");
======================
上面这两句话大错特错了!,你怎么能分配空间后就开始fopen呢,你要知道filepath此时里面的内容可都是谁也不知道的东西哦!
请问你调用函数的实参是否有文件路径?
如果有的话,那你在调用函数中就不要把它抹掉~!
如果没有的话,那你就应该在打开之前给他文件路径!
|
在term下输入ulimit -c unlimited
运行你的程序
会看到core.xxxx的文件
然后gdb ./程序名 ./core.xxxx
接着输入where就可以看到是什么地方死掉了
运行你的程序
会看到core.xxxx的文件
然后gdb ./程序名 ./core.xxxx
接着输入where就可以看到是什么地方死掉了
|
字符串是段错误的高发地,用gdb调试下很容易解决
|
段错误多半由数组越界产生的
好像是这个问题
如果src的长度大于n,则不会向dest中复制空字符串,在下面使用它时就会出错。
好像是这个问题
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中复制空字符串,在下面使用它时就会出错。