字符串数组上的基本qsort在qsort()中崩溃

时间:2013-07-14 12:15:45

标签: c arrays string crash qsort

我尝试使用qsort创建一些基本代码来对字符串数组进行排序,但是根据gdb,它在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);
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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

char pn[10][256];

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

要针对此特殊情况进行修复,您可以将比较更改为

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

并调用

qsort(pn, 4, sizeof pn[0], pcmp);