C 有时我的程序给出了SEGFULT,但有时它能工作,我找不到故障

C 有时我的程序给出了SEGFULT,但有时它能工作,我找不到故障,c,segmentation-fault,C,Segmentation Fault,我正在学习c语言,所以我对它知道的不多。编译代码时没有失败或错误,但当我尝试运行它时,有时它只是失败,给了我一个分段错误。我试着在GDB中运行它,但没有给我任何问题,它总是工作得很好 #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct{ int palabra; int cantPag; int *paginas; } palPag; t

我正在学习c语言,所以我对它知道的不多。编译代码时没有失败或错误,但当我尝试运行它时,有时它只是失败,给了我一个分段错误。我试着在GDB中运行它,但没有给我任何问题,它总是工作得很好

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct{
    int palabra;
    int cantPag;
    int *paginas;
} palPag;

typedef struct{
    int nConsulta;
    int uno;
    int dos;
} stConsulta;

void consultarPaginas(palPag *arrayPalabras, stConsulta *arrayConsultas, int cantConsultas, int cantPalabras, FILE *salida){
    int m;
    for (m = 0; m < cantConsultas; m++){
        int n, o, p, q, r, s, min;
        n = arrayConsultas[m].uno;
        o = arrayConsultas[m].dos;
        p = 0;
        q = 0;
        r = 0;
        if (arrayPalabras[n].cantPag < arrayPalabras[o].cantPag){
            min = arrayPalabras[n].cantPag;
        }
        else{
            min = arrayPalabras[o].cantPag;
        }
        int *arrayAux = (int *) malloc(sizeof(int)*min);
        while (p < arrayPalabras[n].cantPag && q < arrayPalabras[o].cantPag){
            if (arrayPalabras[n].paginas[p] < arrayPalabras[o].paginas[q]){
                p = p+1;
            }
            else if (arrayPalabras[n].paginas[p] > arrayPalabras[o].paginas[q]){
                q = q+1;
            }
            else if (arrayPalabras[n].paginas[p] == arrayPalabras[o].paginas[q]){
                arrayAux[r] = arrayPalabras[n].paginas[p];
                r = r+1;
                p = p+1;
                q = q+1;
            }
        }
        fprintf(salida, "%d", r);
        printf("%d\n", r);
        for (s = 0; s < r; s++){
            fprintf(salida, " ");
            fprintf(salida, "%d", arrayAux[s]);
        }
        fwrite("\n", 1, sizeof(char), salida);
        free(arrayAux);
    }
}

void sort(palPag *arrayPalabras, int cantPalabras) {
    int x;
    for (x = 0; x < cantPalabras; x++){
        int i, j, a, n;
        n = arrayPalabras[x].cantPag;
        for (i = 0; i < n; ++i){
            for (j = i + 1; j < n; ++j){
                if (arrayPalabras[x].paginas[i] > arrayPalabras[x].paginas[j]){
                    a =  arrayPalabras[x].paginas[i];
                    arrayPalabras[x].paginas[i] = arrayPalabras[x].paginas[j];
                    arrayPalabras[x].paginas[j] = a;
                }
            }
        }
    }
}

int main(){
    FILE *palabras, *consultas, *salida;
    char line[100];
    palPag *arrayPalabras;
    stConsulta *arrayConsultas;
    int cantPalabras, cantConsultas, j;

    palabras = fopen("palabras.dat", "r");
    if (palabras == NULL){
        printf("El archivo palabras.dat no se ha leído correctamente\n");
    }

    consultas = fopen("consultas.dat", "r");
    if (consultas == NULL){
        printf("El archivo consultas.dat no se ha leído correctamente\n");
    }

    if ((palabras == NULL) || (consultas == NULL)){
        printf("Alguno de los archivos no ha podido ser leído\n");
        exit(0);
    }
    salida = fopen("salida.dat", "w");

    //Stream al inicio del archivo (provisional)
    fseek(palabras, 0, SEEK_SET);
    fseek(consultas, 0, SEEK_SET);

    while(fgets(line, sizeof(line), palabras) != NULL){
        cantPalabras++;
    }

    while(fgets(line, sizeof(line), consultas) != NULL){
        cantConsultas++;
    }

    //Stream al inicio del archivo
    fseek(palabras, 0, SEEK_SET);
    fseek(consultas, 0, SEEK_SET);

    //Arreglo de palabras y sus páginas
    arrayPalabras = (palPag *) malloc(sizeof(palPag)*cantPalabras);

    for (j = 0; j < cantPalabras; j++){
        int k;
        int l;
        arrayPalabras[j].palabra = j;
        fscanf(palabras, "%d", &k);
        arrayPalabras[j].cantPag = k;
        arrayPalabras[j].paginas = (int *) malloc(sizeof(int)*k);
        for (l = 0; l < k; l++){
            fscanf(palabras, "%d", &arrayPalabras[j].paginas[l]);
        }
    }

    //Arreglo de consultas
    arrayConsultas = (stConsulta *) malloc(sizeof(stConsulta)*cantConsultas);

    for (j = 0; j < cantConsultas; j++){
        int k;
        int l;
        arrayConsultas[j].nConsulta = j;
        fscanf(consultas, "%d %d", &k, &l);
        arrayConsultas[j].uno = k;
        arrayConsultas[j].dos = l;
    }

    sort(arrayPalabras, cantPalabras);
    consultarPaginas(arrayPalabras, arrayConsultas, cantConsultas, 
    cantPalabras, salida);

    free(arrayConsultas);
    free(arrayPalabras);
    fclose(salida);
    fclose(palabras);
    fclose(consultas);
    return(0);
}

正如我所说,我不太懂c语言,所以我的代码有点凌乱,甚至还没有完成。

一个原因可能是使用了未初始化的变量

基本上,在使用坎帕拉布拉斯之前,您不需要初始化坎帕拉布拉斯。这是未定义的行为

同样的情况也适用于咨询顾问

另一个原因是:

    fscanf(palabras, "%d", &k);
    arrayPalabras[j].cantPag = k;
    arrayPalabras[j].paginas = (int *) malloc(sizeof(int)*k);
您不检查来自fscanf的返回值,因此不知道k是否已初始化。换句话说,k可以在未初始化的情况下使用

你应该做:

    if (fscanf(palabras, "%d", &k) != 1)
    {
        // Add error handling here
        ...
    }
    arrayPalabras[j].cantPag = k;
    arrayPalabras[j].paginas = (int *) malloc(sizeof(int)*k);
有时我的程序会给出SEGFULT,但有时它会工作-因此它总是有未定义的行为。cantPalabras是未初始化的。您是否尝试过一个名为valgrind的工具来帮助您找到问题所在?它确实对这些错误有很大的帮助,而且似乎您正在使用linux,它应该是可用的,没有任何问题。salida=fopensalida.dat,w;未检查故障,也未检查ArrayPalaras=palPag*mallocsizeofpalPag*cantPalabras;。另外,不要强制转换malloc,检查整数溢出或只使用calloc。