C语言 如何修复分段错误 11 错误



我希望 main 返回 "dati" 中出现 "mdl" 的位置。我设置了"schema"函数来查找每次出现的起点,但是当我从命令行运行程序时,它返回:

Segmentation fault: 11

我不知道如何解决这个问题。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int schema(int testo[], int nT, int modello[], int nM, int primo) {
    int i, j, k;
    static int r[12];
    j=0;
    for(i=primo; i<nT; i++) {
        if(testo[i] == modello[0] && testo[i+1] == modello[1] && testo[i+2] == modello[2] && testo[i+3] == modello[3] && testo[i+4] == modello[4] && testo[i+5] == modello[5] && testo[i+6] == modello[6] && testo[i+7] == modello[7]) {
        r[j] = i+1;
        j++;
        }
    }
    return *r;
}

int main(int argc, char** argv) {
    FILE *in;
    FILE *out;
    int i, m;
    const int n = 100;
    int dati[n];
    int *soluzione;
    int start;
    if ((in=fopen("dati.txt", "r"))==NULL){
        return -1;
    }
    for(i=0; i<n; i++) {
        if (fscanf(in, "%d", &dati[i]) < 0){
            fclose(in);
            return i;
        }
    }
    int mdl[] = {0,0,0,1,1,1,0,1};
    m = sizeof(mdl)/sizeof(mdl[0]);
    *soluzione = schema(dati, n, mdl, m, start);
    for(i=0; i<12; i++) {
        printf("- risultato[%d] = %dn", i, soluzione[i]);
    }
    //out = fopen("risultati.txt", "w");
    //...
    fclose(in);
    return 1;
}

必须使用该函数来查找事件,我不能使用其他方式。

您正在取消引用指针soluzione,但它从未使用值初始化:

int *soluzione;
...
*soluzione = schema(dati, n, mdl, m, start);
读取未初始化的值

以及随后取消引用该未初始化的值会调用未定义的行为。 在这种情况下,它表现为分段错误。

在这种情况下,您不需要指针。 只需将变量声明为 int 即可。

int soluzione;
...
soluzione = schema(dati, n, mdl, m, start);

您也不初始化start . 因此,您可以在未知位置索引testo,该位置可能超出数组的边界。 这也调用未定义的行为。

编辑:

看起来您实际上从schema返回了错误的数据类型。 如果要返回指向本地数组r的指针(在这种情况下很好,因为它被声明为 static ),该函数需要返回一个int *,您应该return r .

然后,在main中,您将保留soluzione作为指针,但直接分配给它。

int *schema(int testo[], int nT, int modello[], int nM, int primo) {
    ...
    return r;
}
int main(int argc, char** argv) {
    ...
    int *soluzione;
    ...
    soluzione = schema(dati, n, mdl, m, start);
我想

错误在于以下代码段:

for(i=primo; i<nT; i++) {
    if(testo[i] == modello[0] && testo[i+1] == modello[1] && testo[i+2] == modello[2] && testo[i+3] == modello[3] && testo[i+4] == modello[4] && testo[i+5] == modello[5] && testo[i+6] == modello[6] && testo[i+7] == modello[7]) {

请注意,您将 dati (这是一个大小为 n 的整数数组)传递为testo,并将n作为 nT 的值传递。因此,testo的大小为 nT .但是在你循环中,i可能会运行到nt-1,你访问testo[i+7],这超出了testo的边界,对吧?

相关内容

  • 没有找到相关文章

最新更新