2013-07-14 55 views
0

我试图使用的qsort排序字符串数组创建一些基本的代码,但它崩溃中的qsort,根据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); 
} 

回答

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; 
} 
+0

顺便说一句,是什么使得PCMP静态的目的是什么? –

+0

@DominikC问他吧。我觉得我已经足够投下strcmp意志了。 – BLUEPIXY

+0

这是一个静态的原因,就是你在做“man qsort”时得到的例子。我复制/粘贴它。 – user2316370

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

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

char pn[10][256]; 

实际上,pn是10个数字char[256]。这些东西是布局不兼容的,并且qsortchar[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); 
+0

谢谢,我不知道内部有一些“布局想法”。我认为它只是解析字符串,跳过零字节,解析下一个字符串,而不是真的关心256 .. – user2316370