我试图使用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);
}发布于 2013-07-14 20:23:08
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-14 20:34:40
qsort(pn, 4, sizeof (char *), pcmp);您告诉qsort您想要排序的是一个包含4个char*的数组,但是
char pn[10][256];实际上,pn是一个10 char[256]的数组。这些东西是布局不兼容的,并且qsort将char[256]的第一个字节中的一些字节解释为char*s,这是未定义的行为,并且不太可能导致分段错误。
要修复此特殊情况,您可以将比较更改为
static int pcmp(const void * a, const void * b)
{
return strcmp((const char *) a, (const char *) b);
}和调用
qsort(pn, 4, sizeof pn[0], pcmp);https://stackoverflow.com/questions/17639290
复制相似问题