Algunos prefacio: soy un estudiante de ingeniería en computación de tomar un primer clase en C después de 3 semestres de Java (hasta estructuras de datos). Esta pregunta es en relación a la realización de una tarea, pero un par de pasos removidos de la solución para mí.

Tengo un archivo de entrada que leí en la memoria de tal manera que es almacenado en char[9][500]. He leído en más de 500 cadenas de caracteres de longitud máxima de 8. Estoy tratando de ordenar esta matriz mediante stdlib construido en qsort() función, y estoy teniendo algunos errores de memoria.

Importante fragmentos de código:

char data[4][500][60];
char debug[500][9];
size_t count = 0;

/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");

while(!feof(pUserlog))
{
    fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
    fgets(data[3][count], 60, pUserlog);
    count++;
}

Esta sección lee los datos en las matrices. La matriz de interés en esta parte es «depurar». Esta es la matriz especificada anteriormente. Aquí está mi función de comparación para qsort:

int compare(const void* a, const void* b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    puts("I'm in compare!");
    return strncmp(*ia, *ib,8);
}

Este es mi intento de llamar qsort:

size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);

He intentado sustituir debug_len en mi llamada en cuenta es, pero todavía estoy segfaulting. Aquí está la salida:

$ ./prueba 
depuración len: 1125, count: 453, sizeof(char*): 4 
Estoy en comparar! 
Segmentation fault (core objeto de dumping) 

Gracias!

while( !feof() ) está equivocado. feof devolverá false, el bucle se introducirán, la scanf fallará a la lectura de datos, depuración[ cuenta ] contendrá falsos datos y, a continuación, feof devolverá true. Usted puede solucionar este caso haciendo el conteo– después de que el bucle, pero en general, usted debe nunca hacer mientras( !feof())
¿De dónde violación de segmento? Es un buen ejercicio para examinar el volcado de núcleo para determinar donde la violación de segmento que ocurre, ya que generalmente se le dice cuál es el problema.

OriginalEl autor Andy | 2011-03-20

2 Comentarios

  1. 9

    La función comparar recibirá punteros a los elementos que se comparan. En realidad está tratando de comparar caracteres usando strncmp(). Ya que los punteros a cada una de las cuerdas, echó a un char * y comparar.

    int compare(const void* a, const void* b)
    {
        const char *ia = (const char *)a;
        const char *ib = (const char *)b;
        puts("I'm in compare!");
        return strncmp(ia, ib, 9);
    }

    Recordar también, que es un array de arrays, no un array de punteros. Así que el tamaño de un elemento debe ser el tamaño de la matriz, 9 y no de el puntero, 4. En este punto, sería más fácil usar sizeof debug[0] ya que es una matriz de dos dimensiones. Si usted no hace esto con los tamaños adecuados, qsort() se acaba de destruir la matriz.

    size_t elemsize = sizeof debug[0];      /*   9 - size of each element */
    size_t count = sizeof(debug)/elemsize;  /* 500 - number of elements in array */
    qsort(debug, count, elemsize, compare);

    OriginalEl autor Jeff Mercado

  2. 4

    Lo que sucede aquí es: tienes 500 cadenas. Ahora se pasa todo el 500 a qsort, y que a su vez pasa a cada uno, como el primer y segundo argumento a su función de comparación. Es un poco como escribir esto:

    compare(debug[0], debug[1])

    El compilador de C pasa las direcciones, no los valores reales de curso. Pero ahora a interpretar el puntero a void como puntero a puntero a char. El código ahora hace un eliminar la referencia al llamar strncmp, pero que hace que los valor (los primeros 4 bytes) ser tratado como un puntero en strncmp. Pero strncmp ahora en vez de intentar eliminar la basura «puntero» (que consiste de parte de uno de sus cadenas) y que hace bang.

    Para solucionar este problema, utilice char * en lugar de char **:

    int compare(const void* a, const void* b)
    {
        puts("I'm in compare!");
        return strncmp((const char *)a, (const char *)b, 8);
    }
    s/strncpy/strncmp/
    Balter: Gracias, he corregido mi respuesta.

    OriginalEl autor DarkDust

Dejar respuesta

Please enter your comment!
Please enter your name here