1

根据 gdb,我尝试使用 qsort 创建一些基本代码来对字符串数组进行排序,但它在 qsort 中崩溃:

#include <string.h>
#include <stdlib.h>

static int pcmp(const void * a, const void * b)
{
  return strcmp(* (char * const *) a, * (char * const *) b);
}
int main()
{
  char pn[10][256];

  memset(pn, 0, sizeof(char) * 10 * 256);

  strcpy(pn[0], "hello");
  strcpy(pn[1], "TEST");
  strcpy(pn[2], "abc");
  strcpy(pn[3], "000000");

  qsort(pn, 4, sizeof (char *), pcmp);
}
4

2 回答 2

1
static int pcmp(const void * a, const void * b)
{
  return strcmp( (const char *) a, (const char *) b);
}
int main()
{
  char pn[10][256];

  strcpy(pn[0], "hello");
  strcpy(pn[1], "TEST");
  strcpy(pn[2], "abc");
  strcpy(pn[3], "000000");

  qsort(pn, 4, sizeof (char [256]), pcmp);
  return 0;
}
于 2013-07-14T12:23:08.073 回答
1
qsort(pn, 4, sizeof (char *), pcmp);

您告诉qsort您要排序的是 4 的数组char*,但是

char pn[10][256];

实际上,pn是 10 的数组char[256]。这些东西是布局不兼容的,并且会qsort解释char[256]aschar*的第一个字节中的一些字节。这是未定义的行为,并且不太可能导致分段错误。

要针对这种特殊情况修复它,您可以将比较更改为

static int pcmp(const void * a, const void * b)
{
  return strcmp((const char *) a, (const char *) b);
}

和调用

qsort(pn, 4, sizeof pn[0], pcmp);
于 2013-07-14T12:34:39.517 回答