本文介绍了用C段错误的qsort的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图按照手册页使用的qsort,但不管我怎么努力我不断收到一个段错误
下面是code的,重要
一节 INT compare_dirent(常量无效*一,常量无效* B)
{
常量结构的dirent *第一=(常量结构的dirent *)一个;
常量结构的dirent *秒=(常量结构的dirent *)B: 回到一线>的d_ino - 二线>的d_ino;
}
INT过程(FILE *输出,为const char *目录名,INT标志)
{
结构的dirent *条目= NULL;
结构的dirent *表[256];
INT entry_num = 0;
DIR *目录= NULL;
焦炭CWD [1024]; GETCWD(CWD,1024);
bzero(表,256); 目录=执行opendir(目录名);
而((项= READDIR(目录))!= NULL)
{
如果(entries-> d_type == DT_REG)
{
fprintf中(输出%s \\ t \\ n,entries-> d_name);
表[entry_num] =条目;
entry_num ++;
}
}
fprintf中(标准错误,最后一项:%S \\ n,表[entry_num-1] - > d_name); /* 就在这儿 */
的qsort(表,entry_num,sizeof的(结构的dirent),放大器; compare_dirent); 返回entry_num;
}
在运行GDB我看到文件列表在while循环每目录fprintf中
,我看到的最后一项。我把一个断点在比较哪个执行N次,其中N是文件的数量,然后我立刻得到_qsort段错误。
在第N个电话的qsort从崩溃到compare_dirent。
下面是GDB输出
启动程序:/用户/卢克/文档/开发/ code / cs647 / PROG2 /斌/ PROG2 ./
阅读符号共享库+ ........................完成
.main.c.swp
get_pdf.sh
main.c中
main.o中
Makefile文件
program2.pdf
的test.txt
最后一个条目:test.txt的断点1,在compare_dirent main.c中(A = 0x7fff5fbff018,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)N
89常量结构的dirent *秒=(常量结构的dirent *)B:
(GDB)N
91回归一线>的d_ino - 二线>的d_ino;
(GDB)C
继续。断点1,在compare_dirent main.c中(A = 0x7fff5fbff430,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)C
继续。断点1,在compare_dirent main.c中(A = 0x7fff5fbff848,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)C
继续。断点1,在compare_dirent main.c中(A = 0x7fff5fbffc60,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)C
继续。断点1,在compare_dirent main.c中(A = 0x7fff5fc00078,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)C
继续。断点1,在compare_dirent main.c中(A = 0x7fff5fc00490,B = 0x7fff5fbfec00):88
88常量结构的dirent *第一=(常量结构的dirent *)一个;
(GDB)C
继续。节目接收信号EXC_BAD_ACCESS,无法访问内存。
原因:KERN_PROTECTION_FAILURE地址:0x00007fff5fc00490
0x00007fff8e238540在_qsort()
解决方案(完全)是一个小两个答案
INT compare_dirent(常量无效*一,常量无效* B)
{
常量结构的dirent *第一=(常量结构的dirent *)一个;
常量结构的dirent *秒=(常量结构的dirent *)B: 回到一线>的d_ino - 二线>的d_ino;
}
INT过程(FILE *输出,为const char *目录名,INT标志)
{
结构的dirent *条目= NULL;
结构的dirent表[256];
INT entry_num = 0;
DIR *目录= NULL;
焦炭CWD [1024]; GETCWD(CWD,1024);
bzero(表,256); 目录=执行opendir(目录名);
而((项= READDIR(目录))!= NULL)
{
如果(entries-> d_type == DT_REG)
{
fprintf中(输出%s \\ t \\ n,entries-> d_name);
的memcpy(表+ entry_num,条目的sizeof(结构的dirent));
entry_num ++;
}
}
fprintf中(标准错误,大小:%吕\\ N的sizeof(结构的dirent));
的qsort(表,entry_num,sizeof的(结构的dirent),compare_dirent); fprintf中(输出\\ n \\ n);
的for(int i = 0; I< entry_num;我++)
{
fprintf中(输出%s \\ n,表[I] .d_name);
} 返回entry_num;
}
解决方案
你的一个问题是:
的qsort(表,entry_num,sizeof的(结构的dirent),放大器; compare_dirent);
应该是:
的qsort(表,entry_num,sizeof的(结构的dirent *)&安培; compare_dirent);
第三个元素是宽度
,每个对象的大小。由于表
是结构的dirent *
的数组,这是你想要什么样的规模。
你还滥用由readdir的返回值。从:
That means it's quite possibly all of the values in your table are the same pointer, with the same value. You can use readdir_r
, or just allocate struct dirent
(one for each readdir call), and memcpy the value in place.
An alternative is to change it to be an array of struct dirent
, in which case you would use your original qsort
call.
这篇关于用C段错误的qsort的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!