使用qsort和printf时出现分段错误

我正在尝试通过搜索md5哈希文件并使用bsearch在rockou数据库中找到它们来制作破解密码的程序。 我的问题是我遇到了由我的qsort或我的printf引起的分段错误(我运行Valgrind并且它说printf,但是操纵qsort会改变错误输出)。 我似乎无法在线找到解决方案,虽然我已经尝试刷新stdout以及在qsort函数中调整数组大小的不同方法。

char **dict = read_dict( argv[2] );

read_dict,我没有放在这里,因为它是一大堆代码,接受字典文件,将其拆分为字符串数组,将其格式化为hash:password,并为其设置mallocs空间。 然后它返回包含每个字符串的指针数组的指针。

 int qcompare( const void *a, const void *b) { return strncmp( *((char **)a), *((char **)b), HASH_LEN); } 

qsort(dict, (sizeof(dict) / sizeof(dict[0])), sizeof(char *), qcompare);

 for (int i = 0; dict[i] != NULL; i++) { printf("%s\n", dict[i]); } 

这里显示的printf不是我正在使用的那个,它只是我试图用来调试我的代码的一个更简单的。 这是我第一次发帖,所以希望我没有做任何格式化这个问题的错误。 提前感谢您提供的任何帮助。

read_dict按要求

  char **read_dict(char *filename) { FILE *f = fopen(filename, "r"); if (!f) { printf("read_dict: file error message\n"); exit(1); } int arrlen = 0; int i = 0; char **dict = NULL; char buf[PASS_LEN]; while (fgets(buf, PASS_LEN, f) != NULL) { if (i == arrlen) { arrlen += STEPSIZE; char **newdict = realloc(dict, arrlen * sizeof(char*)); if (!newdict) { printf("read_dict: newdict error message\n"); exit(1); } dict = newdict; }// end of if buf[strlen(buf) - 1] = '\0'; int slen = strlen(buf); char *pass = malloc( (slen + 1) * sizeof(char)); strcpy(pass, buf); char output[(HASH_LEN + PASS_LEN + 1)]; sprintf(output, "%s:%s", md5(pass, strlen(pass)), pass ); dict[i] = output; i++; }// end of while if (i == arrlen) { char **newarr = realloc(dict, (arrlen + 1) * sizeof(char*)); if (!newarr) { printf("read_dict: newarr error message\n"); exit(1); } dict = newarr; } dict[i] = NULL; return dict; }// end of read_dict