我正在尝试按C键中的某些记录进行排序。
M 记录数量,每条记录的语法为:
KEY v -------- DATA v
1234ABCD。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz
每条记录都有一个8字节的十六进制密钥值,后跟64字节的数据
流程如下:
现在我正在尝试在qsort函数中定位键,但是我遇到了分段错误。
成功打开文件后的代码。
if((fstat(fileNum, &sb)) == -1) {
printf("fstat fail");
exit(-1);
}
int sb_size = sb.st_size;
int num_records = sb_size/REC_SIZE;
printf("SB SIZE: %d\n", sb_size);
printf("num_records: %d\n", num_records);
addr = (char *)mmap(NULL, sb_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileNum, 0);
if (addr == MAP_FAILED) {
close(fileNum);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
int num_records_per_thread = num_records/num_threads;
printf("Number of Records per Thread = %d\n", num_records_per_thread);
qsort(addr, num_records_per_thread, REC_SIZE, compare);
int compare(const void *a, const void *b) {
struct mRecord rec1, rec2;
char *keya;
strncpy(keya, (char *)a, 8);
printf("in Compare: first 8 bytes are: %s", keya);
return 1;
}
这给了我一个分段错误。我怎样才能定位键并对它们进行排序? 非常感谢你。
答案 0 :(得分:1)
1)你不能使用strncpy复制keya上的变量a,因为keya是一个未初始化的指针!
2)函数compare必须返回一个比较值!
然后在函数比较中你可以写:
return strncmp( (char *)a, (char *)b, 8 ); //8 is the key length!