Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C中的qsort(),**buf和buf[]_C_Linux_Qsort - Fatal编程技术网

关于C中的qsort(),**buf和buf[]

关于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"))){

当我在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"))){
            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));
}