首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串数组上的基本qsort在qsort()中崩溃

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

Stack Overflow用户
提问于 2013-07-14 20:15:45
回答 2查看 488关注 0票数 1

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

代码语言:javascript
复制
#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);
}
EN

回答 2

Stack Overflow用户

发布于 2013-07-14 20:23:08

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-07-14 20:34:40

代码语言:javascript
复制
qsort(pn, 4, sizeof (char *), pcmp);

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

代码语言:javascript
复制
char pn[10][256];

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

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

代码语言:javascript
复制
static int pcmp(const void * a, const void * b)
{
  return strcmp((const char *) a, (const char *) b);
}

和调用

代码语言:javascript
复制
qsort(pn, 4, sizeof pn[0], pcmp);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17639290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档