【问题标题】:qsort on equal sized list of char arrays in cqsort在c中相等大小的char数组列表上
【发布时间】:2018-10-15 21:19:20
【问题描述】:

我有一个 ma​​lloc 的字符数组列表,如下所示。

list= (char**)malloc(LIST_SIZE* sizeof(*list));
for (int i = 0; i < LIST_SIZE; i++)
    list[i] = (char*)malloc(sizeof(char) * 33);//33 is the size of each element in the list

列表的大小可以增加到 25,000(LIST_SIZE) 或者有时可能只有 10 个元素或更少。

我的 compare() 函数会出错。

    int compare(const void * a, const void * b)
{
    const char **fpa = (const char**)a;
    const char **fpb = (const char**)b;
    return strcmp(*fpa, *fpb);
    //return *(char *)a - *(char*)b;//This one also does not work
}

qsort() 是这样调用的。我怀疑它失败是因为它被调用的方式,但我不明白为什么。

qsort(list, current_list_element_count, 33, compare);

【问题讨论】:

  • qsort(list, current_list_element_count, sizeof *list, &amp;compare);
  • @Stargateur 你的意思是我为什么要使用幻数?或者为什么是 33 号?
  • 没关系,我没有看到list[i] = (char*)malloc(sizeof(char) * 33);,但正如 dbush 所说,这不是预期的大小qsort()
  • OT:这个const char **fpa = (const char**)a;应该是char * const *fpa = a;
  • OT^2:无需投射malloc()。至少如果你真的会使用 C 而不是 C++。

标签: c arrays sorting qsort


【解决方案1】:

您将错误的元素大小值传递给qsort

即使您为每个数组分配 33 个字节,您实际上并没有数组数组。你所拥有的是一个指针数组,每个指针都指向一个数组。

由于数组的每个成员都是char *,因此您想传递它的大小:

qsort(list, current_list_element_count, sizeof(char *), compare);

或更笼统地说:

qsort(list, current_list_element_count, sizeof(*list), compare);

这样,您传递的大小不取决于类型。

【讨论】:

  • 注意:即使这个答案使用了array这个词以便于阅读,它们也不是数组而是指向相同类型的连续数的指针。
  • @Stargateur array 等效项如何?我的意思是它的声明和分配。
  • @John_D int list1[10]int list2[25000][33] 都是 数组int *list3[25000] 是一个数组(指针)。鉴于“增长到 25,000”,是否可以使用 list3strdup()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2021-12-13
  • 2015-04-11
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多