为什么我会遇到分段错误(核心转储)

时间:2020-02-10 15:18:38

标签: c99

嗨,我不知道为什么会出现细分错误错误。我必须给定指向文件的指针(该文件每行包含一个数字,例如第一行中的12232和第二行中的240,等等。)我必须为每个数字查找并打印重复多次的密码在数字中,在12232行中应打印f:“数字为12232,数字为2”

void stampa(FILE *fp) {

    char m[MAX], copia[MAX], *fp_m = m;
    int rip, dim, i, j, massimo=0, valore;

    if (fp == NULL){
        printf("Puntatore a file vuoto.");
        exit(0);
    }

    while(!(feof(fp))){
        fgets(m, MAX, fp);
        fp_m = m;
        dim = strlen(m)-1;
        for (i=0; i < dim; i++){
            copia[i] = fp_m[i];
        }
        copia[i] = '\0';

        for(i=0; copia[i]!='\0'; i++){
            rip = 0;
            if (copia[i] == '*')
                i++;
            else{
                for(j=i; j < dim; j++){
                    if(fp_m[i] == copia[j]){
                        rip++;
                        copia[j] = '*';
                    }
                }
                if (rip == massimo && fp_m[i] > fp_m[valore])
                    valore = i;
                if(rip > massimo){
                    massimo = rip;
                    valore = i;
                }
            }

        }
        massimo = 0;
        printf("Il numero piu' ripetuto in %s e': %c \n", m, fp_m[valore]);
    }

    return ;
}

1 个答案:

答案 0 :(得分:0)

以下是几个错误:

  1. while(!(feof(fp))){ is always wrong

  2. for(i=0; copia[i]!='\0'; i++){
        rip = 0;
        if (copia[i] == '*')
            i++;
    

    copia[i]=='*'时,i将在if子句中递增一次,并在循环结束时再次递增。这将跳过*之后的字符。特别是,如果字符串以'*'结尾,那么您将跳过尾随的空字节并开始在未初始化的内存上运行。您最有可能只想在continue;时什么也不做(或可能copia[i]=='*')。

添加fp_m指针并不会使这个错误变得更好或更糟,但是更改堆栈的布局可能会导致循环最终运行为空字节并终止而不是崩溃。这实际上是一件坏事,因为它使您认为该漏洞在不存在时就消失了。使用C进行编程时,在程序运行之前进行不相关的更改是一个极坏的习惯。