关于C中的qsort(),**buf和buf[]
当我在Mac上的C中使用qsort()时,这些代码运行良好,它可以很好地对一个文件中的每一行进行排序关于C中的qsort(),**buf和buf[],c,linux,qsort,C,Linux,Qsort,当我在Mac上的C中使用qsort()时,这些代码运行良好,它可以很好地对一个文件中的每一行进行排序 int compare(const void *p, const void *q) { return strcmp(p,q); } void function_name(){ char buf[1024][1024]; int i=0; FILE * fp; if(!(fp=fopen(filename,"r"))){
int compare(const void *p, const void *q) {
return strcmp(p,q);
}
void function_name(){
char buf[1024][1024];
int i=0;
FILE * fp;
if(!(fp=fopen(filename,"r"))){
perror("Open error!");
exit(0);
}
while(fgets(buf[i],1024,fp)){
//printf("%s",buf[i]);
i++;
}
qsort(buf, i, sizeof(buf[0]), compare);
}
但是,当我使用malloc分配空间时,它很糟糕。为什么呢?
下面的代码显示我使用malloc生成一个二维数组。我在前后打印buf的内容。看来我失去了所有的信息
int i=0;
FILE * fp;
char ** buf;
buf = (char **)malloc(sizeof(char*)*1024);
if(!(fp=fopen(filename,"r"))){
perror("Open error!");
exit(0);
}
buf[0]=(char *)malloc(sizeof(char)*1024);
while(fgets(buf[i],1024,fp)){
i++;
buf[i]=(char *)malloc(sizeof(char)*1024);
}
for(int j=0;j<i;j++){
printf("%s",buf[j]);
}
printf("hehe%ld\n",sizeof(char)*1024);
qsort(buf, i, sizeof(char)*1024, compare);
printf("hehe\n");
for(int j=0;j<i;j++){
printf("%s",buf[j]);
}
最重要的是,如何修复我的malloc版本?当您尝试将
qsort
buf
声明为char**buf
时,您使用了错误的比较函数。正如我在评论中所指出的,char buf[x][y]
是x
字符数组的y
字符,例如作为参数传递时的char(*)[y]
。当您将buf
声明为char**buf代码>,则声明指向char类型指针的指针。在任何一种情况下,您都有一个指向字符串的指针,并且您必须取消引用传递给qsort
的每个值,以增加一个间接级别,例如
int cmpstrings (const void *a, const void *b) {
return strcmp (*(char * const *)a, *(char * const *)b);
}
使用char**buf的简短示例代码>将是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* qsort string comparison - for pointer to pointer to char */
int cmpstrings (const void *a, const void *b) {
return strcmp (*(char * const *)a, *(char * const *)b);
}
int main (void) {
char *ap[] = { "This is a tale",
"of captian Jack Sparrow",
"a pirate so brave",
"on the seven seas." },
**buf = NULL;
int n = sizeof ap/sizeof *ap;
if (!(buf = malloc (n * sizeof *buf))) { /* allocate pointers */
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
for (int i = 0; i < n; i++)
buf[i] = strdup (ap[i]); /* allocate/copy strings */
qsort (buf, n, sizeof *buf, cmpstrings);
for (int i = 0; i < n; i++) { /* print and free */
printf ("buf[%d] : %s\n", i, buf[i]);
free (buf[i]);
}
free (buf);
return 0;
}
qsort
、memcpy
和类似函数假定指针传递的点位于数组中。数组的定义就是在相邻的内存单元中连续分配的x个项目数。例如char数组[x][y]代码>
关于指针指向指针的使用存在广泛的混淆。有一个老技巧可以用来声明查找表,其中每个项都指向一个可变长度的数组,如下所示:
char** ptr = malloc(x * sizeof(char*));
for(int i=0; i<x; i++)
{
ptr[i] = malloc(y * sizeof(char));
}
char**ptr=malloc(x*sizeof(char*);
对于(int i=0;如果基础char buf[][]
是char类型数组的数组,char**buf
是指向char类型指针的指针。(不保证这些值在内存中是连续的)所以,我不能在这里使用malloc?注意:也可以将ap
直接传递到qsort
buf
是不必要的,但可能是为了向OPYes说明,我会这样做,但我想提供一个在指向char的指针上分配和排序的示例。好的一点。好的,我想nt指出,在任何实际架构上,交换1024字节的qsort项都比交换指针慢。。。
$ ./bin/qsortptp
buf[0] : This is a tale
buf[1] : a pirate so brave
buf[2] : of captian Jack Sparrow
buf[3] : on the seven seas.
char** ptr = malloc(x * sizeof(char*));
for(int i=0; i<x; i++)
{
ptr[i] = malloc(y * sizeof(char));
}