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

标签 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);
}

最佳答案

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);

关于c - 字符串数组上的基本 qsort 在 qsort() 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639290/

相关文章:

html - Flex,如何处理HTML文件

c - 空终止与计数变量的优点

arrays - 如何从数组中减去数组?

javascript - 如何在javascript中通过属性删除对象

c - 如何从c中的null分隔的char数组中读取字符串?

c++ - 通过套接字进行数据传输[TCP]如何在c/c++中打包多个整数并使用send()recv()传输数据?

C++ 双字符数组分隔符

c - 如何将文件行中的字符保存到字符数组中?

Java:如何从字符串中获取 Iterator<Character>

c - 将char [128]数组写入C中的文件