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

时间:2017-04-24 03:26:23

标签: c arrays segmentation-fault printf qsort

我正在尝试通过搜索md5哈希文件并使用bsearch在某个数据库中找到它们来制作破解密码的程序。我的问题是我遇到了由我的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

0 个答案:

没有答案